19: The SPI project is growing up, DocC uploading with AWS Lambda, and Are we server yet?

News about Swift on Server, AWS Lambda arm64 performance, and package highlights from the last couple of weeks of the Swift Package Index.

This should definitely go in.

- Got the cat going, yeah.

- Everything.

This has like strong Twitter Spaces vibes.

- Well, I think it's a little more,

it's a little more professional

than we used to do on Twitter Spaces.

Not that much more professional,

but a little bit more.

- It had its charm, to be honest.

It had its charm.

- Indeed, and I kind of liked,

let's talk about it for a second.

I kind of liked it because

there was a couple of really unique features

of it that I thought were really quite strong, which is it had that network effect.

There were advantages and disadvantages to this.

As soon as you went to even enter a Twitter space, people would start joining because

it would pop up at the top of their timelines and they'd just come in.

Now the disadvantage of that is that you couldn't set up your space before people started joining,

which was always a little bit like, oh, it's all just happening all at once.

But the advantage of it was that you instantly got people coming in and listening and interacting

and that was good.

Very, very different to a podcast.

But yeah, I thought it was a good service.

Yeah, I really liked the casualness of it.

You're sort of easing into it and it's almost like as a listener, there's an open

door and there's some people fiddling around with microphones and they're sort of doing

their thing and you check out, oh, okay, it says Swift package indexing might be interesting.

I'll just, I'll just wander in, sit down and see what's going on. And I really liked the

appeal of it. I also noticed when we started not doing it live, it felt a bit weird initially

because I don't know how to describe it. When we sat down for the Twitter spaces and even

though there weren't many people, there were some people and I felt like,

you know, we weren't just talking to each other, but there were other people

listening that I was sort of in my mind addressing and that changed perspective

slightly, ever so slightly. And I think that has settled down a bit.

So I'm sort of conjuring up a virtual audience in my head now,

as it's just the two of us talking.

But it was a very interesting, subtle difference in how you sit down and chat.

Yeah. And if you told me beforehand we'd be doing a live recording,

that would have probably, well, that would have certainly stressed me out more than it actually

did when we sat down and did it. We, someday, you know, at some point, I don't remember how it came

to be, we decided we were just going to try and do this. And we sat down, connected and chatted,

and there was no nervousness or weirdness about it, really. It was quite bizarre how it happened

and then how it tended to be a really interesting experiment

for the time that it lasted.

- You're right, and I think that the casualness of it

is its strength, or was its strength,

depending on, I actually switched to the spaces tab

on the Twitter app the other day,

and nothing loaded, so maybe it's no longer,

but that definitely was its strength of just like,

well, you can just, you don't have to make this

into a big deal, you can just open up a space

and start talking and people can start listening.

And the other really nice thing about the UI

is it showed the people.

So when it showed you a space at the top of your timeline,

the icons of the profile pictures that were in the space icon

were the people who you followed who were in that space.

And so you could recognize people you knew

that were listening to something

and that's a really great way to get people to.

- Yeah, I love that.

I really like to see familiar faces,

like literally faces pop up in the UI.

I do wonder, I mean,

Mastodon, which is where I've moved to,

is interesting in many ways,

and one of the ways it is quite interesting,

apart from just being a micro-blogging service

similar to Twitter,

It has these other social networks powered by the underlying protocol activity pub, like

an Instagram, like picture sharing.

That's called PixelFed, is it?

Yeah, exactly.

And also a YouTube like video sharing thing.

There's also something about podcasting and I've been meaning to explore this a little

further because I do suspect there is something that could work a little bit like a Twitter

space with audio, perhaps also with video.

I certainly wouldn't, you know, it wouldn't have the client side integration yet quite

like Twitter used to have, but it feels like there's something there that could be hooked

into and perhaps with a little glue or web page or something could be made to work a

a little bit like it or maybe there's even more than I imagined there being already.

I think it might be worth having a bit of a look or if someone listening knows more,

I'd be really interested to hear what the options are.

I do know there's some podcasting stuff that is based on ActivityPub available already.

I just haven't had time to look into that.

Sounds like some non-coding work.

of non-coding work. That's exactly what I've been doing over the last few days.

You may or may not know that there is a legal entity behind the Swift package

index project. And it's a company we set up because we needed a legal entity

actually, originally for a Apple developer account.

And that was the thing that pushed us over the edge into setting up a legal

entity because we needed to register for an Apple developer account so that we

could sign package collections. That was

the initial event that made it

happen. But that is growing up a

little bit as of this week, which it now

has a bank account, which it hasn't had so

far because we've been dealing with the

money just kind of without, we really

didn't want to start up the whole

accounting process for that company, so

we've been dealing with sponsorship

money outside of that legal entity at

at the moment, but it's time for the project to grow up a little bit and creating a legal

entity was one part of growing up and giving that legal entity its own bank account is

another part of growing up and it feels like we're coming out of the toddler years and

into the small child years.

Yeah, it's interesting.

I mean, going up to, well, it's like year three, right?

Yeah, in April it'll be three years.

So yeah, we're getting there.

- It is, and it's also probably worth

just talking a little bit about

the kind of finances of what we do here.

So we are currently supported by two mechanisms.

We have GitHub sponsors,

and if you are already a GitHub sponsor,

then thank you so much for that support.

It's literally invaluable to us.

And that's organized through obviously GitHub's sponsorship system.

There are many open source sponsorship systems around there, but we picked,

we picked GitHub to run ours.

And then we also have a couple of adverts on the site from Stream, who writes a

chat SDK, so you can add kind of real time chat to your applications, and Emerge,

who run several tools actually that will help you slim down your applications,

optimize startup time for your applications and various other things around kind of

optimizing what you ship to the app store.

And so again, I think it's worth us, we haven't mentioned our sponsors so far on

the podcast, and I'm not sure we'll do it every single time, but given we're talking

about this kind of stuff, this company stuff, I thought it was nice to give them a quick

mention.

And you really would help us out if you haven't heard of either of those companies, nip to

the Swift Package Index page, and they've both got links on the homepage there.

So yeah, so that's our primary source of income for it.

We also have financial help in a different way from companies who support the hosting

of the packaging.

So we have our main hosting where the website runs and where all of our Linux analysis and

build processes run is provided by Microsoft Azure.

It's always a pleasure to work with both of our hosting providers.

when we approached them, they couldn't do enough for us.

They were fantastic.

And they were actually the second hosting providers

come on board.

Originally, Mac Stadium were our hosting provider,

and they remain our hosting provider for our Mac, iOS,

watchOS, and tvOS build infrastructure.

So and again, it's such a pleasure working

with both of those companies.

Their only questions are, how can we help?

That's basically how I describe those relationships.

And we couldn't do this project without their help

because we, the amount of hosting going out on one side

and the amount of income from sponsors

and advertising on the other side, they don't add up.

- No, those numbers don't line up, no, unfortunately.

And we should say, I mean, this is more or less

a full-time project for the both of us.

The income that we have is really nice

that we do appreciate it a lot.

It wouldn't support the hosting costs that we have.

It also doesn't, as of yet,

support our actual time investment.

So that does help us a lot,

but don't take away from us opening a bank account

that we're overflowing with funds or anything.

That's not quite the case, but...

(laughing)

- We're not getting into investments with all our funds.

- No, but it is really great,

especially also the individual GitHub supporters.

It's always great.

Every week we update the list of sponsors,

like on our homepage, you see the little GitHub avatars

and they shuffle around as you refresh the page.

And every week we update to the latest list.

And it's great to see when the new faces

appearing in the list of sponsors.

And if you feel like you want to be in that list,

don't hold back.

We do appreciate it a lot.

- Absolutely.

Yeah, and I do think it's nice to just kind of

step back from things a little bit

and look at obviously how far we've come

with the actual project, but how far we've come

with making this into something that we hope

will be here for a very long time

and providing the service that it provides

and more for many, many years to come.

- Yeah, yeah, definitely.

Right, do we have some techie news to talk about as well?

- I think we have DocC uploading news, right?

That is right, yes.

So the doc uploaded out, we talked about last time,

is actually live now.

And it was pretty much done for quite a number of weeks now

and I was tweaking it a little, trying to tune it a little,

mainly around the difficulties of trying to get

this whole process to finish and to run

within the 15 minute AWS Lambda hard cutoff.

So there's a 15 minute timeout, a runtime budget that you get.

And after that, the Lambda is killed.

And in all my testing, there has never been a problem with the largest

dock set that we have and that sort of spawned this whole thing.

But yet I was caught out at the last minute with a surprise with respect to performance,

because my testing that I've done, pretty much almost all of it,

I have done with the ARM64 Lambda, the Graviton2 processor node on AWS.

And that's purely because the turnaround for testing was easy for me to deploy from an ARM Mac directly to an ARM binary into that Lambda.

I did test initially, I did compare the x86 and the ARM64 performance,

at least in one aspect and that was the unzipping of the file and that took

like around 40 seconds on the ARM64, it was a couple of seconds faster on the x86

and that sort of gave me confidence that they would be operating at the same level of performance

and then I just subsequently focused on trying to get the test one, so the ARM64 Graviton based one

to run as fast as possible to stay within our 15 minute window and that worked fine.

So the ARM one consistently ran in around 11 minutes

in all my testing without a largest doc set.

Now, when all of this was done,

we debated whether we should deploy the production version

as an ARM64 or an x86 variant.

And ultimately we decided to go with the x86 variant

because I had already set up an auto deployment GitHub action

that would allow us to just tag a version

and that would then auto deploy into an AWS Lambda.

So there would be no blessed development machine setup

be required to deploy into that Lambda.

Literally just tagging the thing would do it all from there.

I toyed with the idea of making that process ARM-based,

but the problem is GitHub Actions,

so the GitHub runners aren't any ARM64 runners.

So the only option really would have been to set up our own hosted runner,

which isn't a huge deal, but at that point, given how often we actually plan to change that Lambda,

if you set up a GitHub dedicated runner, you probably might as well just have it on one of

our or both of our machines to do it ad hoc whenever needed, because one environment would

would have to maintain anyway, so it might as well be one

that's not as removed because we'd have to pick

one of our max stadium machines to host that as well.

And it's just a bit weird and awkward

to set that up in parallel.

So that's why we arrived.

We said, all right, let's use x86 to deploy.

And then the funny thing happened, we were all set.

I tagged the thing, gave it a final test,

and it timed out.

So the x86 runner actually took

more than 15 minutes to finish.

and it did that consistently.

Like it did not finish within the time interval.

And I was really stumped because in my early testing,

I had actually expected that to be slightly faster.

And the weird thing is the part that is,

you'd expect to be compute bound,

which is the unzipping was as fast

or maybe even slightly faster than the ARM64 version,

but all the networking stuff happening after that,

like the transfer of the unzipped files,

the 70,000 files of one gigabyte in total into S3

actually took way, way longer with the x86 variant.

Now, I guess that's not architecture related.

Perhaps it's where these things run.

So I'm guessing, I have no idea,

but it looks to me like in this case,

at least in this case, well, A, in this case,

it's very obvious that the x86 Lambda,

you know, takes probably around 40% longer

than the ARM64 variant to the degree

that it wasn't actually usable for us.

So that took the decision out of the picture

to actually use GitHub Actions to deploy it.

And we now ended up doing what we debated doing earlier

and it's just deployed straight from our dev machines

into the production environment.

But what's really bizarre is that the x86

takes so much longer, I guess, in the network traffic.

I found it really weird, but that's where we arrived.

So that was a lesson learned for sure.

I thought I tested the performance aspects

that are going to be the critical ones,

and yet, yeah, there was a surprise there.

- Yeah, and to step back slightly

from the kind of nitty gritty of executing these,

we do have a fairly significant problem

with the size of these archives.

And we are talking to the documentation, the DocC documentation team about, so

we're both members of the documentation work group that Apple set up.

Um, and we have raised, um, a couple of times and I know that it's kind

of on the list of things to look at.

Swift syntax is the, is the main problematic package that we have, that

we've been using as our, as our test cases in this one.

Yeah, it is.

Um, so there's certainly not a gigabyte's worth of actual type

documentation or source code in that package.

And so it kind of, the current output of doc C

is significantly larger than hopefully

it needs to be at some point.

And so it feels like we are right on the edge

of this just being possible right now.

And I hope that that size heads down instead of up.

- Yeah, I wonder how much of it is actually the size

giving us the long upload time.

I guess also all the requests, round trips of 70,000 files,

individual files being synced.

That's also not helping.

I think both figures need to go down a bit.

I do wonder how that will be possible

because as far as I can tell,

the number of files pretty much scales with the symbol.

So each symbol that you can click on has a representing file

with the metadata to populate the page, the documentation page.

And I'm not sure how much that's possible architecturally in Doc C

to bundle these up or group them somehow,

you know, move away from these being individual files in the file system.

But I still, I'm not sure there are 70,000 symbols in Swift syntax.

I don't know, there might well be, but I suspect there's some duplication happening

in the package overall that hopefully can be reduced at some point.

Yeah, but the good news is that it's now deployed.

Yeah, exactly. We're currently only dealing with that one package for the moment due to the way

we've onboarded and set our processing thresholds, but we'll subsequently lower this and onboard

more packages because the process overall is faster for all packages and should make it

it's smoother and easier and avoid any sort of difficulties with other packages

that might run up against our internal,

because we also have a time budget for the build process

and the upload process both together.

And if a build takes very long

and then the documentation stage comes after that,

it might actually be cut off by our time constraint on the whole build process.

So it'll certainly help to offload this to the Lambda entirely soon.

Yes.

Right.

That was the Doc Uploader news.

Did we have anything else?

So kind of.

I have one more thing which I'd like to just briefly mention, which I saw today.

And it's a new website called areweserveryet.org.

Yeah, I saw that one by Tim.

Yeah.

So this is from Tim Condon, who is one of the Vapor team members.

And he's also on the Swift server work group with Apple.

And he had a look at this,

a Rust site called Are We Web Yet?

And this is the,

here's the terms of the Swift version of that site.

And basically, and I think we've needed something like this

for a little while.

It's a website which just gives a bit of background

information about Swift on the server.

It doesn't try and teach you Swift on the server,

although it does give you links

to Swift on the server tutorials and various other references that you can read.

But it really just says, here are the main frameworks. We've got Vapor, Smoke, and

Hammingbird. It says that Hammingbird is quite new. Vapor and Smoke are production ready and mature.

It talks about how the ORM that we have works. Or not even how it works, but just gives you a link

to it, give you places that you can go and find out a bit more.

And I think this has been missing from the kind of server-side Swift.

In fact, I was writing something about it the other day for iOS Dev Weekly, and I actually

changed what I was going to write because I couldn't bring myself to go and Google all

the names of the different frameworks.

Obviously I know Vapor because we use Vapor.

I remembered Hummingbird, but for the life of me I couldn't remember Smoke.

And then I maybe thought there was another one as well.

I thought Amazon did one.

Wasn't there one called Perfect or something at one point?

But some of them have gone.

Some of them, like Kitura has sadly, I mean it's still up and around, but it's not really

actively developed anymore.

So I thought this website was worth mentioning.

Yeah, really nice.

So we've got some good information on WebAssembly there as well.

I am quite bullish on Swift on the server,

because I enjoy it tremendously.

And I really hope that this just raises awareness

about what's possible.

And especially now that Async/Await

is pretty much in all the frameworks,

it is such a nice environment to develop in.

And I hope it gets picked up more.

It's, you know, we've been over this before.

I think pretty much everything is there

that you might need.

It doesn't have necessarily the depth,

like, you know, the number of packages implementing the same thing in multiple ways, but there

is something there for pretty much anything, everything you might want to do server-side.

So I think it's really great.

Yeah, and I think you're right to be bullish on it for backend services, like an API backend

in Swift is, you know, you're going to have a great time developing something like that

with whatever framework you use.

I think there is quite a lot of work still to do if it's to become a front-end web application

platform as well.

So obviously we're building a front-end application with Vapor, but it feels like it maybe has,

there's more work to do on the front-end side of things than the back-end.

But yeah, it's all, we're heading down a path here and we're heading in the right direction.

Yeah, I mean, I guess in Swift as a language and ecosystem,

it's almost like the default is a JSON API backend

and then a mobile app frontend, right?

So the frontend part is almost like slightly different.

If you ask people,

what's the frontend backend situation in Swift,

they'd probably give that as the answer

and not immediately think of a web frontend.

- Yeah, the frontend is the iOS app or the Mac app.

Yeah, yeah, exactly.

On the other hand, I haven't actually done

a whole lot of web front-end work.

I know that our setup is slightly unusual

in that we're using an HTML DSL to actually render the pages,

but that's not the only way of doing it, right?

There's the more common approach

of using a templating language.

I think mustache is a very common one, or a leaf.

So I wonder if a lot of your concerns about web front-end maturity

would actually look slightly different if that's what we had chosen?

Not so much.

No? Okay. Interesting.

Yeah, not so much because I think actually the generation of the HTML

is pretty nice actually with what we're using with Plot.

And certainly I really have grown to appreciate the fact

that we can manipulate units of what eventually becomes HTML as types and

objects within our Swift code.

That's, there's a lot of power in that system.

The bigger problem is slightly further towards the front end for me.

So in order to do kind of any real modern front end development, you're going to

need something like an Assassin compiler and some kind of JavaScript dependency manager.

You don't obviously need one, but we do use one.

And that kind of stuff is just completely separate from everything else that we do.

And we've got it working like it's no problem.

And we could even spend some time making that more automated by leveraging some of

of the Swift package manager build tools and things like that.

Yeah.

We could potentially integrate that a little further, but at the moment,

developing pure front end stuff, I'm talking like CSS styling and JavaScript

functionality in the browser, the development environment for that is, is

less than ideal because you kind of have to run your project through Xcode to get

the server running and then upload a pure CSS and JavaScript editor and have the

build process for the front end stuff running.

And it's not even as simple as just adding the, the build step for the

front end to the Xcode build process.

Because that, what that would mean is that every time you changed a CSS value,

you'd need to rerun the Xcode project, which is just, that's not really how.

Like I'm front end people are used to very, very smooth, um, workflows where

you just save your CSS file,

it compiles everything in the background

and everything goes live.

And that's what we have right now,

but it's not, that doesn't feel like a particularly

smooth process with a Swift on the server project right now.

- Right, because you sort of have a double approach

you need to build if you have source code changes,

you need to build an Xcode.

And if you have just like CSS changes,

you need to have a file watcher or something

that kicks that off separately.

Exactly.

And that file watcher is, is, is instant and always works.

And so that's where I don't, I wouldn't want to lose that by putting the, the,

the front end process through Xcode, because that's not going to have the

file watcher and not going to have any of that kind of stuff, but at the moment,

there is that quite big disconnect between have I changed HTML or have I changed

CSS or have I changed JavaScript?

And then I need to manually pick which bit of the system to run to

make sure that my changes are live.

And it's fine.

You know, it's not a huge problem, but it's certainly not as...

It's kind of the rough... I would say it's the rough edge of where we are with Swift on the server at the moment.

Well, you know what the solution is, right?

We need a Swift, CSS, and JavaScript DSL, and a Mac Studio that runs it really fast.

You know, I know that there are a couple of people working on CSS DSLs in Swift,

and I don't particularly want to start writing CSS in Swift, honestly.

I think CSS or Sass is a perfectly fine way to write CSS.

But it would absolutely,

for it to even be in with a chance of me considering it,

it would need to be, it would need to solve that problem of,

I don't wanna build and run to do new CSS.

- All right, there's a challenge.

(laughing)

- And with that said,

shall we do some package recommendations?

- Yeah, let's do some packages.

Okay, I am gonna start us this week

with a package from Gil Gonzalez

called Swift Markdown UI.

And it's been around for a couple of years,

but there was a version two release a couple of days ago.

And it's a complete rewrite apparently.

So it's rewrite from scratch with, as Gil says,

a ton of new features and improvement.

And the one that caught my eye

was GitHub flavored markdown.

So this is a native component for Swift UI applications.

It's not, we're not dealing with the web here.

This is back in Apple land.

And there are a lot of solutions, both Apple provided.

You know, it can, the standard frameworks

can render Markdown these days,

but there's a big difference between Markdown

and GitHub-flavored Markdown.

We've run across this with the package index a few times.

at having a good quality GitHub flavored markdown render

for your SwiftUI app,

feels like something that would be worth looking into.

- Yeah, absolutely.

I did see that pop up as well.

Also has documentation hosted on the Swift package index,

if I remember correctly.

- All the best packages do, Sven.

- Yeah. (laughs)

That's why we pick them, right?

(both laugh)

- You know, honestly, that's not why I picked this one.

In fact, I hadn't noticed it at the documentation

until you just mentioned it then.

But if there are two packages

and one of them has documentation hosted by us

and one of them doesn't,

I can't say which one I'm gonna pick.

- Yeah, I saw that and it's really great.

And you're right, the difference is quite remarkable

that it could get flavored Markdown.

I think one of the big things is tables, right?

That GitHub Markdown has, yeah.

- Tables, yeah.

Yeah.

And things like auto lists and task lists.

Obviously, you may not need all those features,

but certainly the GitHub Flavor Markdown is,

in my experience, a good set of changes

on top of standard markdown.

- Yeah, yeah, definitely.

- So that's Swift Markdown UI.

- All right, so my first package is called

KVK Calendar by Sergei Kwiatkowski.

And this is a UI component,

like a calendar component.

And it offers what looks like

really a complete calendar view drop-in.

I mean, if you look at the screenshot

in the package description,

you, at first glance, you probably would think

this is a screenshot of plain old calendar,

you know, like the built-in app.

- Yeah, it really does look like it.

- It has everything, right?

It has time zone support, light, dark mode,

full support for a calendar.

If you need a calendar in your app

and deal with that sort of display,

this is the package to go for.

I did find interesting that it lists support for iOS,

iPadOS, macOS, and Mac Catalyst.

Yet our compatibility matrix

actually only shows support for iOS

and the actual little platform badge,

which is not ours.

this is like a manually set badge also only shows iOS.

So I suspect this is a case where we actually,

correctly I'd say, find that it's only iOS compatible

for the moment because looking at the build errors,

they look to be genuine on the other platforms.

Maybe in the past it was compatible with all platforms

and is only iOS compatible for the moment.

But even so, this is a great package.

So if you're on iOS, this looks really interesting

if you have a need for a calendar view.

KVK calendar by Sergei Kwiatkowski.

- Yeah, it certainly looks comprehensive

if that's what you're building.

And obviously there's been a lot of work done.

I think there's also a standard kind of date picker type

calendar control within SwiftUI these days.

Just to note as well that this component

is UIKit, not SwiftUI.

- Oh, right, yeah, yeah, that's worth pointing out.

- Which is just always worth mentioning.

But this is, I'd encourage you if you're listening to the podcast, just go and have a quick look at the screenshot that's associated with this.

It really does look like the Apple Calendar app.

Oh, interesting. If you are a SwiftUI user, fear not, because in the readme further down, it actually has the UI view representable all spelled out,

which looks like a drop-in, and then you should be good to go to use it from SwiftUI.

Right.

Yeah.

Nice package.

There you go.

Great.

My next one is called Draftsman by Neander Haberty and Draftsman is a layout

builder based on auto layout, but with a declarative approach.

So there have been lots and lots of DSLs around auto layout over the years.

And certainly with SwiftUI coming along, auto layout is very much a UI

kit and app kit technology, which is not been taken forward into SwiftUI.

The layout in SwiftUI is handled in a completely different way, of course.

And this is also not a new package.

This has been around for a couple of years.

But again, there was a recent release 10 days ago, which got this package

into my list of things that I wanted to take a quick look at.

And I quite liked the syntax of this DSL.

So you can kind of say my view dot draftsman dot left equal to other

view dot draftsman dot right.

And then right dot equal to with a parent offset by this much.

And it reads quite nicely in terms of if you're wanting to do auto layout in code,

which I know a lot of people want to do, then this seemed like a really quite a

pleasant DFL to start to do that with.

- Nice.

- And it caught my eye.

- All right, my next package is called Tart

by Cirrus Labs.

Now, this is not a package to use as a dependency.

This is one of those packages that we have in NX

that is a executable, a developer tool,

which is open source,

and is obviously a sort of package that you can build.

you probably would typically install it via Homebrew.

And this caught my eye while I was researching ways to get an Apple Silicon GitHub runner up and running.

Because what this does, this is a virtualization framework based tool

that allows you to spin up Mac VMs with a command very much like you do with Docker commands.

So Tart run and then image name and Tart build and then a base image and some stuff and then you can create new images.

And this is the underlying mechanism the company Cirrus Labs, which is a Apple Silicon based CI provider,

what they use to power their CI.

So a lot of this tool is actually geared and it says so Mac and Linux VMs on Apple Silicon

to use in CI and other automations. So what you can do is use this to build images that you use

in CI and by build I mean not just pull in a macOS 13.2 base image. You can also use Packer

which is a sort of an automation tool to build OS images.

To go further than just getting the base image in,

you can actually run, then install steps afterwards,

you know, to configure the VM, to install Homebrew and Xcode

and all sorts of stuff and have sort of a script

that is run through to build that image.

And then you can even push that image

to OCI compatible registries, which are like Docker registries.

So imagine you use Docker to manage images and run containers.

Effectively think of this replacing your Docker in your command,

Docker run, Docker build with Tart,

and then you can do the same for macOS images.

I've played around with this just a little bit

and built an image based of a IPSW file,

which are the files you can download with the macOS installer files.

So if you use that as an input, you can build one of those images and then spawn it and launch it from the command line.

And it brings up a, you know, like you would expect when you run a virtual machine

with one of the many tools that have spawned up recently based on virtualization framework.

Yeah, and I found that really interesting because this also has plugins to actually set up GitHub Action Runners.

So it looks to me like this would be a really neat way to set up a self-hosted runner

without all the custom setup that you would do with this.

You can actually bake all the configuration into a couple of setup files

that you then run to create the image and then you manage the GitHub runner,

spawning and push it to this mechanism rather than sort of setting up a bare metal macOS machine or VM

and sort of handcraft the machine itself to run,

you can actually script all of this and then make it easily deployable

across multiple machines with all the same setup.

So yeah, it's called Tart by Cirrus Labs.

Interesting. Yeah, I haven't come across this before,

but I've just been taking a quick look at it while you've been talking there,

and it does look interesting.

Oh, and I should add, I read this out, this is not just backwards machines.

you can use the same mechanism to build Linux VMs.

And obviously, Packer is multi-platform.

So with Packer, you can create images for both,

you know, many, many different OSs.

One other note, the thing that I wanted to mention,

it's really interesting how many open source virtualization solutions

have popped up based on virtualization framework.

I find that quite remarkable.

So I've been using, what's it called? Virtual Buddy, I believe.

Yes, Virtual Buddy by Guillermo Arambo,

which is a little app wrapper he wrote that wraps virtualization framework,

which does exactly the same thing really.

You can build your own image, you can run it.

It's a little mackup that does pretty much what parallels and VMware fusion allow you to do as well.

And this has been around for a while and it's based on virtualization framework.

So virtualization framework is really the thing that does all the heavy lifting of

building the VM and managing the VM.

But many people have written these wrappers and sort of innovated on top of it to build these

Docker-like things or VMware-like things to manage VMs. And I find that really interesting,

and I'm really curious where this will lead in the future to easily and very commonly

run VMs more on macros than we used to. Well, I'm also curious whether what Apple did with

with the development of that virtualization framework

is the end of their story with it.

You know, are they happy to be the framework vendor

and let other people build on top of it?

Or is this step one in a plan from Apple

to produce either something that just runs VMs

like all these other apps that have popped up?

Or is there something actually a little more fundamental

in the works?

- Every time in June, every year in June,

This TART thing looks exactly what I would imagine as a dev tool by Apple.

I haven't played around with this enough, but

this really seems to do the thing that I really like about Docker,

where you can build your images and then rely on them to be immutable and always there,

and you just, you know, you bring them up,

have them do their thing, and then, you know, they go away again.

And it's, there's no magic machine that you set up once,

and then you always worry that might drift

from the original config.

This is the great thing about Docker

because you never have these stick around along.

You always make sure that everything you want

happens in the base image.

And I think this is really the thing

that does this for macOS.

I'd be curious to play around with this more.

- Right, so my last package is a testament

to writing interesting release notes

because one of the things that we put in our RSS feed

was not only the link to the package page on package index,

but also whatever release notes

that were entered into GitHub.

And as I was scrolling past all the release notes,

as I was scanning the packages for this podcast,

I came across this release note.

And I'm gonna say the release note

before I even tell you what the package is.

This release includes a complete refactor.

Now it's just better.

(both laughing)

And I read that and I thought,

well, I have to now see what this package is.

And it's a package called Sunkit.

The organization that's produced it is Sunlit,

but as I can see by our new author support,

the person who has written this is Nicolas Marigniello.

And it's a package that I am almost certainly

never going to use,

because what it does is it uses maths and trigonometry

to compute all sorts of information

about where the sun is relative to wherever you are.

So for example, it can calculate first light

and last light, sunrise, sunset, golden hour time,

total daylight duration, total night duration,

all sorts of things like that.

It's a package which is extracted from the app,

which is Sunlit, which is an app on the App Store.

And honestly, I don't really have a lot to say about this package.

It feels like it does exactly what it says it's going to do.

But I just, I love that release note.

I thought that release note was great and that made it worth a mention.

That's great.

Yeah, I can also imagine this is the package you want

when you actually have to deal with this,

because this must be super fiddly.

Right. Who wants to write those calculations, right?

Nice.

All right, my last one is called Preview Resizable

and it is by Juan Duarte or Juan Duarte, I'm not sure, I think it's,

first it's based in Barcelona, so that might be Catalonian, which I don't know how to pronounce.

This is a really interesting package because what it does is makes your SwiftUI previews resizable.

And that might sound odd at first because, you know, you set these things up and you give them,

you typically give them a frame or something,

and then they're there, or I think it has a default as well.

But the way this works is it actually is,

it embeds your preview in a larger view

and then gives it a resized handle.

So you can actually, then, you know, within,

obviously you can't extend it out of the size

of your initial view, but you can make it smaller.

So this is really nice when you,

I suppose when you have a view and just might want to test a lot of individual sizes

and you can't really or you don't want to litter your preview with five, six, ten, twenty

individually resized previews. So I thought that was a really neat idea to make this possible

and to give you something to play around because the other option obviously is to run it in a

simulator but then you're back to the lower turnaround and this makes use of SwiftUI's

previews. Yes, I've not seen people use or reviews the interactive element of SwiftUI

previews like this before. So smart little idea. Oh and one other thing I wanted to mention,

I saw this in the readme further down. So there is obviously in order to use this you

need to import the package wherever you defined your previews, right?

You need to import preview_resizable and then there's an additional modifier on your view

available .preview_resizable and when you call that it makes your preview resizable.

But there's a little trick to avoid having to import preview_resizable everywhere and that is

if you embed somewhere within your module,

there's an underscore exported attribute for import.

And what that does is it pulls in all the public API

of a package that you're referencing

and re-exports its symbols

as if they were declared in your module.

And that then makes obviously everything available,

which means you don't have to import it again

in your module, right?

Because everything in your module

is available to your source code

without additional imports, right?

And that was actually the first time I sat down

and thought about how that,

what that underscore exported actually means.

I'd seen this a couple of times before,

but I never actually realized what it does.

And I found that quite interesting.

That it's sort of this, this is the first time

I've seen this being sort of advertised

as a useful little thing you might do.

There's a good tip there to put it in if debug guards,

so you don't compile this into your actual product,

because then you would obviously import all those symbols there,

which is probably not a huge deal, but something you would want to avoid.

So, yeah, there you go.

Preview of Resizable by Juan Duarte.

Great.

Well, that's all the packages I think we have for today.

So, should we wrap it up there?

Let's wrap it up.

Thanks for listening.

And thanks again, just to echo back to both our corporate sponsors,

stream and emerge and for everybody who supports us on GitHub. It really does make all the difference.

So thank you so much. And we will be back in a couple of weeks.

Yeah. See you in two weeks. Bye-bye.

Creators and Guests

Dave Verwer
Host
Dave Verwer
Independent iOS developer, technical writer, author of @iOSDevWeekly, and creator of @SwiftPackages. He/him.
Sven A. Schmidt
Host
Sven A. Schmidt
Physicist & techie. CERN alumnus. Co-creator @SwiftPackages. Hummingbird app: https://t.co/2S9Y4ln53I
19: The SPI project is growing up, DocC uploading with AWS Lambda, and Are we server yet?
Broadcast by