{
"$type": "site.standard.document",
"bskyPostRef": {
"cid": "bafyreib4yorzoar2dy2gw2ozt5qkupyfbkj7wgvjdo6azs5m2s6b7rw2ki",
"commit": {
"cid": "bafyreie3h24zaqd6ujetmd7jlzj6eylxbgwr3gxwiootig4ycbvp5ndx4m",
"rev": "3mnlhvn4yy42y"
},
"uri": "at://did:plc:voaulu4vdmpdwevimf4i6lnj/app.bsky.feed.post/3mnlhvn2rkk2z",
"validationStatus": "valid"
},
"content": {
"$type": "pub.leaflet.content",
"pages": [
{
"$type": "pub.leaflet.pages.linearDocument",
"blocks": [
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Hello! It’s been a while since I’ve posted. I’ve been busy working on my new Social Web client, Mackinac. It’s now been a couple of months since I launched the beta PWA, and it feels like a good time to talk about why I built it and where I hope it goes."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "First, let’s talk about the name, Mackinac (pronounced MACK-in-naw). For those unfamiliar with Michigan (my home state), the Mackinac Bridge is a five-mile-long bridge that connects the Upper and Lower Peninsulas. It makes traveling between them much easier."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "My grandma used to tell me stories about how, before the bridge was built, people had to take ferries across the Straits of Mackinac. Traveling between the two peninsulas was a bit more of a pain back then."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "During a trip to the Upper Peninsula last year, I found myself thinking about what an app designed around managing accounts across multiple protocols might look like. I got the idea for the name while crossing the bridge. The Mackinac Bridge connects Michigan’s two peninsulas, and I liked the idea of building something that could help connect different parts of the Social Web in a similar way."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "I was interested in building something around bridging and was somewhat inspired by the work A New Social has been doing with Bridgy Fed."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "The issue I saw, though, was that bridged accounts often felt like a hack. They were always this weird side thing that existed, but didn’t feel like a core part of the app. I became interested in making bridged accounts feel more native to the platform. I felt the experience could be better."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Mackinac kinda started as an experiment in building a native iOS app. I had never built one before and my background is mostly in web. Native apps have always been an interest of mine."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "After some time building the app, it was clear I was still a bit off from having something I could launch. I was also still trying to get AT Explore to v1, so this was a bit of a side quest. I also knew getting App Store approval would be a bit of a pain. I started working on a PWA (Progressive Web App) because it allowed me to experiment and ship faster without having to deal with the App Store. I officially launched Mackinac as a beta at the end of March."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "I’ve said this in some posts before, but the goal of Mackinac is to connect people across the Social Web no matter what protocol they’re on."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Today, Mackinac supports both AT Protocol and ActivityPub accounts. You can sign in with either a Bluesky account or a Mastodon account and browse profiles, posts, and interactions from both ecosystems. Nostr support is also something I’d like to add in the future."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "I view Mackinac as a Social Web app. I don’t really care what protocol someone is on. If a feature exists somewhere on the Social Web, I think people should be able to take advantage of it regardless of where their account lives."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "I knew when I built this that I wanted bridging to feel more native. This is why one of the first things I prioritized was better integration with Bridgy Fed. I had built an integration in AT Explore, but I really wanted a client with bridging baked in from the start. A few examples of that in Mackinac today:"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.unorderedList",
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#bold"
}
],
"index": {
"byteEnd": 27,
"byteStart": 0
}
}
],
"plaintext": "Bridge switcher on profiles to switch between different versions of a profile across protocols."
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#bold"
}
],
"index": {
"byteEnd": 41,
"byteStart": 0
}
}
],
"plaintext": "Making bridged profiles feel more native. Bridged accounts resolve to their native handle, and a bridge icon indicates that the account originates from another protocol."
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#bold"
}
],
"index": {
"byteEnd": 14,
"byteStart": 0
}
}
],
"plaintext": "Expanded text. If a profile is from a protocol that supports longer posts, you can view the full text. This pulls directly from the post on the other protocol instead of showing a truncated version."
}
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#bold"
}
],
"index": {
"byteEnd": 25,
"byteStart": 0
}
}
],
"plaintext": "Connecting to the bridge. In order to bridge or unbridge your account, there’s usually a follow/unfollow/block process that needs to happen. I built a UX around this to make it more of a one-click experience."
}
}
]
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Since launching, I’ve built a bunch of other things as well. The biggest thing I’ve shipped recently is article support through standard.site. I’m also continuing to expand the multi-protocol side of the app, with Nostr being the next protocol I’d like to tackle."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "I’d like to integrate other lexicons as well and make more of these features available to bridged accounts on other protocols."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "Mackinac is close to v1. I plan to circle back to the mobile app and start making progress there as well. I’ve only made a little progress on the mobile app since pivoting to the web app."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "I do plan to rework most of the original work so I can share code between the web and mobile app. There’s still a lot I want to build, but I’m happy with the progress so far."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"plaintext": "I plan to try and update here a bit more on the progress of the projects."
}
}
],
"id": "019e9367-0334-733c-8ada-d7c09027657e"
}
]
},
"description": "A look at the inspiration behind Mackinac, a multi-protocol Social Web client focused on making bridging feel like a natural part of the experience.",
"path": "/3mnlhvivtnk2z",
"publishedAt": "2026-06-06T01:11:58.789Z",
"site": "at://did:plc:voaulu4vdmpdwevimf4i6lnj/site.standard.publication/3lyxordsb4k2a",
"tags": [],
"title": "Building Mackinac "
}