007 - Goatmire, Old Android Phones, and How To Keep a Secret

All right. Welcome back to another episode of Macro Mayhem. My name's

Peter Ulrich. Today is October 14th,

2026. It is 11:27 AM

Amsterdam time. I'm back in the Netherlands after a very eventful

week at Goatmeier, and I'm joined as always by

my good friend and co-host, Gus Workman. How you doing, Gus?

I'm doing pretty good this morning. How are you? Have you recovered

from your Goatmeier travels? Yes, I'm better now. I mean, after I came back,

I fell sick for the whole week. in plus a few

more days. And yeah, but yesterday I went for my first recovery run and it

didn't feel entirely shitty. So I think I'm, I'm back in,

in the saddle almost 100%. Nice.

Yeah. Uh, let's start with the news. This episode today is a little light

on the discussion part, so we're going to spend some more time on, on news

and blogs. Unfortunately, the first news item of the

week is quite sad.

Margaret Hamilton has died last week. She is

most known as the engineering head

behind the moon landings of NASA in 1969,

and she led the department that programmed

the moon landing software.

Yeah, she died at the ripe old age of 90.

I think that's a pretty good age, but still she will be missed.

Margaret has been exceptional in her work.

She was, yeah, the main reason or one of the

main reasons that the moon landing in '69 actually worked.

She primarily excelled by focusing on

the safety of her software and fault tolerance of her software.

I read the obituary here that we

also linked in the show notes, and it was quite impressive. Because the moon landing

almost crashed. They almost crashed into the moon. But because

the way she designed the software, they could turn off a lot

of the background processes and prioritize the high-priority

procedures that were meant to control

the glider, control the lander to safely land on the moon.

So because they had that option at their disposal,

the moon lander actually landed and didn't crash. I think

that was a very nice story behind this. So we're very sad

for Margaret's departure, but she has been absolutely

outstanding. Also has gotten a lot of rewards and awards

for her excellent work. So she will be missed,

but her memory will live on. Definitely an icon in the

industry and a great female figure in

STEM as well. Exactly. So yeah, moving on

from this sad news, Gus, do you have some better

news for us? Yes. Coming more to the

Beam world, we have some news from the Glean

team. So Glean published

a bit of news recently that the latest version, which is,

I believe, 1.19, .0, uh,

was released, and it now, uh, does not transpile

Gleam code to Erlang source code. So the

title of the blog post is Gleam Doesn't Compile to Erlang Source Anymore, and you

might think that that means it doesn't compile to Erlang at all, or maybe it

compiles to like Beam bytecode, and that's not quite true.

Um, Gleam now compiles to the Beam

abstract form,

which is an intermediate representation that then the Erlang compiler

doesn't have to compile source code files. It compiles the intermediate

format. And this is the same as what Elixir does, from my understanding.

It compiles that intermediate format and then turns that into bytecode. And the reason for

this is that bytecode is part of the Beam. The Beam gets updates once

or twice a year. the major OTP releases,

and that would be a bit of a moving target. So if we can leverage

the existing tooling from Erlang and the OTP team, then you

can get the best of a lot

of worlds. And so this is a really cool update as well, because now

Glean errors and the stack traces will give

you the line numbers for the actual Glean

source code. And before, the errors would

give you the line numbers for the transpiled Erlang

source code. So there's a nice quality

of life improvement there. And the Glean team has also spent some time to make

this performant. So they dropped their standard

compile times by, I don't know, 20, 30%.

They have a few benchmarks in there, but they also are very clear that you

should take those with a grain of salt. So check out the post for more

information, but Gleam got some nice updates and it wasn't just to the Erlang

part. There's a lot of other updates as well, some JavaScript performance

improvements. Um, and yeah,

a whole bunch of stuff. Take a look. Have you used Gleam before?

Uh, I have not used Gleam. I have attended a few talks about Gleam

and I was quite impressed, but, um, yeah, I did not have time to play

around with it yet. I think the coolest thing, and because if you're an Elixir

developer and you haven't played with it yet, is that You think Gleam is just

like a statically typed Elixir, a different syntax, but all

goes down onto OTP. But it's pretty cool because Gleam also

has a compilation target for JavaScript. So you can run your

code on the browser and on the backend on your Beam.

Um, so, right. Take a look. It's pretty cool. Very nice.

I'm always happy to look at them and see that they're making

good progress there. The next item is by

Joseph Alim. He is announcing,

or he has announced, a postdoctoral position in

the type system for Elixir with the IRIF

in Paris. And I believe this is the

extension of the work of Guillaume, right?

The type system Elixir. Guillaume has written his PhD thesis

about it and I guess now doesn't want to continue with the postdoctoral

position, which I can understand.

And José is now looking for a postdoc that wants

to take on the remaining features of the type

system. So if you happen to be a postdoctoral

student, computer science student, and you want to work with the

fine folks in Paris, I'm not sure whether

you need to be in Paris physically, but the position will be in Paris.

Yeah, you can apply to this position.

Next up on the news, Sobolo version 0.16

was released. Sobolo is a static analysis tool for

ensuring that your code is secure. It checks for common security vulnerabilities,

and generally it's a really good tool. You should add it to your projects.

0.16 brings a lot of improvements. The release notes

are very long, very detailed, but take a look

'cause there's a bunch of bug fixes. But the big new

feature that we wanna highlight is that there's now a GitHub output

format for GitHub Actions. And so what

does that even mean? It means that when you run your

Sobolo checks in GitHub, in your GitHub Actions,

it now can output a specific format so that the GitHub

UI can render line by line where your security

issues might occur. And so you can actually look at it. Before,

it kind of spit out this big text chunk

that GitHub would render and show you, but it wasn't like an ideal

workflow to kind of look through it. So now I believe

the main difference, correct me if I'm wrong here, Peter, but the main

difference is that you now have to add a --format GitHub

flag in your CI calls to enable this.

Yeah, I believe so. Yeah. I think previously it was very hard to parse

the Sobolo output in your GitHub CI. So basically you had to rerun it

locally to make sense of it. And this new output format allows

you to have these warning dropdowns

in your log output. So you can see, oh, there's a warning at

this line. Basically. And talking

about SOLO and security in general, we are happy to announce

that we have our first sponsor for the show, and the sponsor is Michael from

praxil.io. And the sponsorship worked

as follows, that Michael paid us a little bit of money, and we interviewed him

a few times to ask his expertise about security questions

that Honestly, I would've asked him also without the money, but don't

tell him that. So in this episode and in the

coming episodes, we will always embed a little snippet of

our interview with Michael, and in each

snippet, we will ask him a question that hopefully is interesting to you.

So this is gonna be the first snippet here. Please enjoy.

And now for the first security question of the week, I would like to introduce

Michael from praxial.io. Michael, I've known you

for quite some years now, and I still don't know what Praxil.io does. Would you

care to elaborate, please? Thank you, Peter. It's great to be

here. So Praxil.io, it's a software product

that companies buy essentially to ensure they don't get hacked.

And it drops right into your Elixir application and implements

several security controls. There's a lot of them that

we can't go into full detail.

Essentially, when a company has to do a SOC 2 audit

or they have a big customer that has a very long security questionnaire,

there's very common security controls and Praxial.io

helps businesses implement those so that

they can finish with the security work, have it running,

and then get back to their real work securely.

That sounds good if I'm a business, but now imagine I'm a person,

an individual developer, or maybe a smaller team.

What can I do to protect myself these days if I

don't want to buy Praxial, but still stay safe in the era of AI

threats? Yeah. And the good news is if you're just starting

out, you don't need to jump to a very powerful solution like

Praxial.io immediately. So for example, if you're an

individual developer, And you're working on a project and you

just want to keep it secure, there's a lot of open source tooling.

For example, I'd recommend Soblo, which is a static analysis tool

for Elixir and Phoenix projects. You can also examine

the security of your dependencies. You can do

that with actually Mix, um, and like the Hex client right now

that's built into the newest release. So just make sure you update. And you'll

actually get that vulnerability intelligence right in your

command line. And another, a big thing I'd actually recommend is

just ensure you have an inventory and list of all of the projects you're working

on so that if, let's say there's some really

big vulnerability that comes out where if your project is exposed to

the public internet and you're running this library, you can very

quickly check and see if you're vulnerable or not, because that

has happened. That's been a constant in security since

the 1990s. And with the way things are going, it seems like that will just

keep happening. So in summary, there's a

lot of things you can do on that side. And then with

the new AI models, you're probably using them to code. They're very good for

scanning your codebase for vulnerabilities.

The challenge is you also need to know a bit about security to use them

effectively. because you can't really just trust the output.

I use them constantly for security assessments,

and they're very effective when you know security, but we're not quite

at the fully autonomous level. There's a lot of discussion about

that right now. So a good source for this is the Erlang

Ecosystem Foundation, the security working group that I'm on.

They put out a lot of material. The Praxil.io blog is

where I publish material on this, so that's a good thing to subscribe

to. If there's a big news story that Elixir

developers need to know about from a security perspective, you know,

I like to use the blog there to communicate it to everyone.

Right. Thank you, Michael. And maybe we will see you next

week on the, well, in 2 weeks on the weekly security question.

See you then. Now, welcome back. I hope

that snippet was interesting to you. And let's continue with the news.

The next news item we have here is about Hologram version

0.12 is released. And that one's interesting because

Hologram really improved their compiler

and the way they compile the Elixir code to be used in the UI.

So Hologram is to write local-first or client-side

UIs in Elixir. And they had that issue that the compiler

was quite slow and there were certain projects they simply couldn't compile because

they were too complex and they would run out of time and memory.

So they spent a lot of time on improving the compiler and they showed

some really big improvements there where they took previously projects

that previously couldn't be compiled and now they could compile them within just a few

seconds. So that was really impressive. And it also tells you a lot about how

you can improve any compilation time if you have some similar problems.

So it's a good blog post to read.

Next up on the news is the release of a library that is kind

of near and dear to my heart, is the work coming from Marc

Lanet, the guy who did

the original ports of Nerves to Android devices.

He's now developed an AI-assisted toolkit to let

your agent have a bunch of tools to help you port Nerves to Android

devices. And so it's called Nerves in Native. And we'll link

the repo in the show notes. But if

you're part of the NERF Discord, you might have seen this past week that

there have been a bunch of people who have reached into their drawers,

found what is essentially e-waste, old phones that they have lying

in those drawers, and they have used this

AI toolkit to port NERFs to those devices. Now, this is like

a kind of complex process. A lot of Android devices are all different.

They run different kernels, they have different security mechanisms. So having the toolkit

is like really cool. And from what I've seen on the Discord,

I think we've probably maybe doubled the number

of Android devices, maybe even tripled the number of Android devices that

now run Nerves these days. Right. It's been really cool seeing people posting,

um, picture after picture of like, hey, I got it running on my whatever.

I saw Samsung, there's some really old phones that are now

running NeRFs, which is pretty cool. Is this going to be the next check?

Like, can it run NeRFs? You know, can it run Doom? Essentially,

can you, can it run NeRFs now? Can it run NeRFs? Yeah.

Very nice. Very cool to see that. Yeah. And I got

to say, I'm still continuing to be impressed by the progress

we are seeing and all the side projects and the scope of the side projects

that people are working on just because they can use an LLM now to point,

You know, with the use of libraries like this one, they point an LLM at

their old Samsung phone and say, hey, you know, install NeRFs on this thing.

And then the LLM goes off and does it. Right. It's not

something that you're likely to spend your own precious free time

on, but when the barrier to entry is lower,

it means that there's a lot more applications that can be done with what is

essentially e-waste. I think people are going to be looking

at making these into like little home dashboards. I saw someone Okay.

He's a little crazy. He strapped an Android phone to

the robotic— he has like the robotic lawnmower

that he took apart. Oh, a robotic lawnmower. Okay.

Yeah. It's like the one that like drives itself around your yard and

chops. He took it apart. He basically just wanted the wheels and the motors

for it. And so he then put the phone, his old Android

phone in as the NERV

controller for the device. And then he made it

into a balance robot. I think he was missing out because he wasn't able to

go to the balance bot workshop at GoatMind.

So now there's a NERV phone driving a balance bot.

But it's a lawnmower. It's like a proper lawnmower that now self-balances.

Kind of. If you change the case for it a little bit to add a

wheel. Wow. There's a very, the picture. I, we're gonna have to link the post

in the show notes because it's,

it's some, it's a thing to behold. It's great. Imagine you would come to his

property and then there's like a, a lawnmower driving towards you,

maybe with a little LCD or like a screen in it and saying,

don't trespass. It's got the phone screen. Yeah.

It's cool. That's funny. Yeah.

So check out Nervsnator if you have old Android devices and extra tokens

to burn. Interesting. All right. And the next item is that

RecLLM 1.27.0 was

released. It is a mostly bug fixes

update, but there are 3 new cool features in here.

And the most interesting one here is that now they

have support for the OpenAI Decisions API.

And that is basically what Jeff is. That's my

understanding. So OpenAI now created their own Jeff-like

decision LLM that is super fast, super cheap,

and that can give you its opinion about

whether something like an image or text is either

true or false. So you can ask it a statement and then

it gives you back it's true or false. It can choose between different

categories. So like choices, and it

can also give you what they say, like a Rubik's API. So a

score against the rubric, whatever that means.

But yeah, so RecLLM now supports that API as well. So if you

want to play around with a Jeff-like model hosted

by OpenAI, you can do that directly through RecLLM now.

Nice. And next up, Jump,

the company, they have a CredoChecks package,

jump.credochecks on Hex, that has a new version.

v0.6.0. This is a minor update with some

bug fixes and some improvements to some of the existing ones,

but I think the big one here is that they added a new Credo check

to avoid modifying structs before they get passed to a

change set. So if you use

these, you might want to update if you want to see the new one.

It's a minor bump, but they're pretty useful. So please take a look. Yes,

very nice. And the last item is something

that probably has been around for a while, but I only learned about it recently,

which is that Hex, our beloved package manager,

they built the Elixir Erlang Docker images for us,

right? So if you run Elixir anywhere,

most likely you use a Dockerfile for it. And that Dockerfile

at the top always has an image tag for your

Elixir version and then the OTP version.

And I don't know how many hours maybe I spent

already on Docker Hub to find the latest image for

the Elixir and the OTP version, because it would then have a timestamp

at the end. So it would be like elixir-otp-debian-slim

and then a timestamp. And just to find that freaking timestamp,

I had to spend so much time on this really, really slow Docker Hub that

just, I don't know why you search for it and it takes 15 seconds to

find, you know, like to do a string match on the Docker tags anyway.

So I found that now HexPM, they expose

their builders and the tags of

the images they create through a very nice URL, which is just bob.hex.pm.

And if you go to bob.hex.pm, you will see that

first of all, you see all the jobs of the current builders. like what

they're building. That's cool if you want to— Live, right? Live, yeah.

It's all, when I loaded it earlier, it was showing some stuff. Exactly. So if

you want to see whether a new Elixir version is already being built, you can

check that here. They also have a tag for artifacts, which are,

I think, binaries that you can download. So you can download a precompiled OTP

version for Ubuntu 26, for example. You can do that right here.

But then most importantly, for me at least, there is a Docker tags tab,

and that allows you to filter by the Elixir version,

and the OTP version and your host OS. So Ubuntu,

Debian, that kind of stuff. And then it will give you the OS version,

which might be, you know, Trixie, and then with the

timestamp behind it. So you can use this website to

quickly find the latest timestamp if you want to upgrade your Docker image

to the latest Elixir version instead of using the Docker Hub one,

which is, I don't know why, Extremely slow. Like you

must, you must want this to be that slow. Like there's no

way that you would have a query that just takes 15 seconds. Like it's engineered

to be slow, I think. Anyway, now we have a better option. I can tell

you're frustrated with it. Yeah, other than hex.pm. Yes, I'm very

frustrated with that. Do you know where the, uh, do you know where the Bob

name comes from? Bob the Builder.

Bob the Builder. Yes. Bob the Builder. So yeah, Bob the Builder at

bob.hacks.pm. Check it out.

And now moving on to the blogs. Gus, what do we have

this week? All right. That wraps up our news.

In the blogs, we have a couple of blogs that were published in the last

week or so. First up is the Goatmire Recap

blogs. These have been a bit of a joy to read, especially because

The 3 that we've linked below come from people who are

involved in the behind the scenes of the conference.

So Lars, who organized the conference, he posted

on his website a very long,

very comprehensive play-by-play

of everything that was going on, including the months leading

up to it. It's a very

comprehensive read. It's a lot of pictures so that if you weren't there,

it's a great way to like get a feel for what the conference

actually was and entailed. I think Galtmeyer has a

certain vibe that is hard to convey with words.

So check out Lars's post there.

In the same vein, Elise, who was one of the ones who Really

was behind the scenes keeping everything on track,

put together. She kind of was the showrunner behind the

curtain, as well as planned a lot of the theatrical

performances with Flora. She wrote

on her personal blog as well about the process of making the music,

helping with the MIDI library that she used for the

Nurse Orchestra. Um, even other things

like the, uh, that she threw in a singing piece

with Sasha, Sasha Urich. Um,

yeah, it's a good read. Uh, I think if you've not

been involved in the planning of a conference, these 2

posts are really gonna help you realize what a tremendous effort that

was on, on so many people.

And then the third one was from the BeamOps

written by Ellie Fairholm. And that

was her recap from more covering some of her favorite

talks, generally what the vibe was there, and also

the workshop that they ran. So take

a look if you missed Goatmire or if you did go to Galtmeyer and you're

already missing it, you can take a look at the recap vlogs that have

been posted already and kind of see

how the event went. Very nice. Yeah. And I also got

to say Pep and Ellie from BeamOps, they're lovely people and they're helping me

with the push-in architecture. So I also know that they are

currently looking for a new contract. So if you have needs of improving

your architecture or operations, DevOps of

your application, give them a shout. Yeah.

And that's what they ran their workshops on at GoMars. Exactly.

Yep. Terraform, Docker, was it a whole bunch of,

yeah, BeamOps. It's, uh, yeah. If you basically, if you,

if you, if your architecture is still point and click,

you know, just give them a shout because they can, they can help

you move everything to a a bit more professional setup with Terraform

and that kind of stuff. All right. Cool. Yeah.

The next blog post is by our returning guest.

I think she writes one blog post a week or two.

So it's Johanna Larsson as always. And she wrote a quite

interesting blog post about how she built her own AT Proto link aggregator.

And Johanna's problem that she tried to solve is that

in Bluesky, that is our new

social media Twitter X competitor.

Johanna sees a lot of articles flying past in her feed. And then

the problem is she wants to read them later or she might not see them

again after a refresh. So she wrote her own little aggregator

that connects through her account to Bluesky and

just saves these links as they fly past. And there's

a very nice overview of the links that have been

flowing in the ecosystem. And you can go

to shelf.cafe, that is the website she built

for this, to see a list of links

to articles mostly that are trending currently

on Bluesky. So it's quite interesting. And in

the blog post, she also wrote in extensive detail about

how she built this aggregator, how she does the algorithm and the

moderation of these links. And so on.

So give it a shout, give it a check. Also, if you just want

to understand how you can connect to the Bluesky ATProto network

to fetch content and information automatically.

Yeah, she's been doing a deep dive on the ATProto ecosystem,

and it's been really cool to see some of these posts coming from

her blog. I, if you go check

out shelf.cafe, I think it's very much similar to a

Hacker News or Lobsters kind of link

aggregator experience. So I'm curious to see where that goes because

even if you, uh, don't use it, it's actually a really cool

implementation of ATProto application

full stack from PDS all the way up to App view

and everything on the beam. Exactly. Um,

yeah. Good. Next up,

we have another returning author, Ryan Zidago,

on using doc tests to understand a feature.

This article is a bit more of an

argument on why you should use not

just docs for your LLMs, not just tests for your

LLMs, but combining them into the single point,

which is the doc tests, which are a cool feature that we have in Elixir.

So he's got a lot of examples on where,

like, there's a lot of code and examples here,

but at the end is that he comes to several conclusions.

There are limitations of this, is the way he ends the article with

some caveats. There are,

like, it increases your module doc sizes, and there's

not always highly observable behaviors encoded

into your specs. But he argues that it does reduce

incorrect answers, and that it makes understanding what the

tests are actually testing a little bit easier because it's embedded with your

docs. So, Yeah, it was a

good article there from Ryan Zitago. Yeah.

And the last blog we have in today's section is

from Alexey Matyushkin, also known as Muda

Sobwa, and he wrote about aggressive regression.

And it's basically a very long article about

his approach to testing. and writing tests

and that he rather goes for regression

tests instead of, well,

he tries to write tests, but then whenever something fails, he goes aggressively

for regression tests to make sure that the test won't fail

again in the future. So yeah,

it's cheaper to write them than to get— than to

have a bug report in the future again that might be because

of the same bug. So he argues a lot about writing your own regression tests,

but the blog is generally a very good introduction

to creating a mindset or shaping your

mindset around which tests to write, how extensive to write them,

and then also which tests are useful and which just aren't.

So I quite enjoyed this blog post because, yeah, it doesn't only focus

on this, like, yeah, you should write regression tests, which is something, you know,

self-evident. But he actually goes through his thinking

about testing and how to build up a test suite that actually helps

you Instead of working against you.

I liked his, uh, also early in the document,

early in the blog post, the argument of what is a regression test

versus a unit test and how unit tests don't

really, um, help you test

too much. It's just asserting that the function does what you think it does.

Yeah. So. It's a good mindset around

testing. It's a good blog post. Very good. And now the

next section, meetups and conferences. We still have, like, every time I think we're

getting a shorter and shorter list here, it kind of extends. So Gus, why don't

you take us through what's up next? All right. So meetups

and conferences. Um, first up, the NURBS Meetup EU is

tonight at 7 PM Central

European Time. So hopefully if you listen to this by the time this goes out,

Later this afternoon, you have a chance to register,

but register for Nervous Meetup EU. Also,

it's recurring, so if you miss tonight, check out for

November. There is also Unconference,

organized by the EEF attached to Codebeam Europe.

Codebeam Europe is October 21st and 22nd. The Unconference

is the day before on the 20th.

If you haven't been to the unconference format before, organized by EF or anywhere else,

you kind of bring your own topics and have

more spontaneous discussions on Beam-related

topics. And then finally, we have the BOB 2027

call for proposals was published. I don't

know too much about this conference, but it's in Berlin in February.

February 26th, 2027. It's more of a functional

programming, data structures, kind of more hardcore computer

science, I would say. And so if you're interested in that

sort of thing, there is a call for proposals due November 2nd,

so about 2 weeks from now. And yeah,

check it out for Berlin in late February. That's all

we have for the meetups and conferences. As usual, if you

have an event, a meetup that you organize and you'd like us to promote it,

reach out to us and let us know. We're happy to put more

stuff in there. Anywho, Peter,

that kind of wraps up the news, the blog posts, the meetups and conferences.

That means it's the audience's least favorite part of

the show, which is your joke. Yeah. All right.

Least favorite. I would say this is the favorite part of the entire podcast.

That's the only reason why people listen to this. That's my opinion on that.

Oh, was that the joke? No, it's not. Actually, I realized I

saved a pretty good joke that I wanted to tell in my Goatmeier talk,

but then I forgot to actually put it in my Goatmeier talk. So now I

still have it here, you know, in the backlog, so to say.

All right. So, you know, put yourself back into

the situation where we were in Sweden, in Varberg,

Goatmeier, you know, Vikings all around. So. The question is,

what do you call a Viking that has lost his boat?

Hiking.

Yep. Very good. Viking ain't going too

far without a boat. Ain't no more sailing.

Hiking. Ain't no more sailing. Very good. Very good.

Well, thank you. That is covering all of the main

content of the of the podcast. We will

start our discussion section now. And this week we're going to talk more

about secrets and how do you keep

stuff secure. So this is kind of a question I posed Peter,

was how do you store your secrets both in production

and in development? How do you,

what's your workflow there? I need a new workflow.

Yeah. Sorry, just to take one step back, we have 2 discussion topics.

added one maybe that Gus hasn't scrolled down to yet. The second

one that I wanted to discuss, if we have the time, is how to run

your own vulnerability scans. Because now that, you know,

the models like Mythos and, yeah, Mythos and

Sol 6.1, like, they're now available

to everyone. Mythos, okay, Mythos 5.1 is not available to

everyone, but if you sign up for their security program, which takes just

an hour, Then you can also get access to Mythos 5.1, even as a

European, non-American. That's the big difference now.

So I wanted to share with you a little bit, you know, now that everyone

has access to these rather powerful models, how can you use

them to scan your own code and libraries and that kind of stuff? So that's

going to be the second discussion topic. First topic is how do you store

your secrets? I have slowly

over time changed more towards keeping everything inside a

password manager, even for local development.

So previously, you know, you would think about 1Password

or similar password managers to keep your production secrets, and somehow

you would then, you know, insert them into your image

that you deploy to production. And actually

this work has, like this change has come through KAML that

I still use to deploy most of my applications.

because they do give you a secrets file, but in the secrets file,

you don't store raw secrets because you can also commit this file to

GitHub. So, but in the secrets

file, what you usually do is you call the password manager CLI

to fetch one particular secret.

And yeah, if you set up 1Password in a certain way,

it will ask you for your permission to fetch all these secrets every

time you deploy. So you actually have kind of like

a check there that, nobody can just call the CLI, but you

have to approve it every time. So. Right. And that's,

that's local on your machine because you're deploying with Kyma, which is basically

SSHing into your server, pushing your release, restarting stuff.

Exactly. But also at that same time, sending the environment variables.

So they're not stored on the server anywhere, right? No, they're only inside

the environment in the Docker container. So there's no,

stored value in the, in the container itself. It's just in the environment.

So yeah, if you get access to the application or the Docker container, you can

obviously still take the environments out, but then I might also have a bigger

issue. Yeah, a little bit. But what

happens if, say, your machine goes down for the

cert, the, the, the data center has maintenance and your machine goes down? Does it

restart and then come back online with those secrets, or do you have to redeploy

manually? That's a good question. I think, I think that, uh,

I think you have to redeploy. Yeah. Because it wouldn't

have the secrets stored anymore. It wouldn't have the secrets. Yeah, I think so.

I haven't tested that one yet. That's a good one. So,

so make sure you have your laptop when you go for vacation

because, uh, yeah, I always have it on me. Data center goes

down. You can't go hiking in the Alps without worrying

about pushing there, Peter. Yeah, it's a good, good point actually. I haven't

thought about that one. Yeah. I mean, but I think that's,

that's what other, um, there are like tools that

do secrets management and, um, like,

was it HashiCorp Vault is one of them that,

and I think those are ones where it can pull the secrets

automatically into your Docker image during the startup of your application.

I don't have that much experience, so I don't know what I'm Fully talking about.

Have you used those before? I have not, but I mean, if you

use something like, um, I mean,

what you mentioned earlier, if your machine goes down and you restart your application,

like if you do bare metal servers, what I'm doing,

you kind of have to manage that yourself, right? You have to restart

your application, inject these environment variables, um, by restarting the application.

If you do a managed server where you just upload your image and then

it gets deployed on a server for you, I think in this situation, I would

also not, I actually had it set up in such a

way for Fly, for example, where you hand over the secret to the provider,

the hosting provider, and they inject it whenever they

start or restart your application. Yeah. And I

think that's a pretty common way for a lot of those managed

hosting services. Yeah. Um,

I, I believe if you're,

if you set some things up properly, you can probably also use

GitHub Actions during your release step to,

uh, use GitHub secrets to inject

into your application as well as it starts up on whatever

hosting provider. I did that too, actually. I have one, one CD where I

use GitHub to deploy through Kamal. And I have my

environments saved as environment variables in the GitHub Actions. So then Kamaal

fetches from the GitHub Action environments to inject

it into the deploy, into the container. But I think the big

point here is just you shouldn't bake the secrets into your

Docker image that you then store on a registry or somewhere.

But this would be the only way that if you restart your Docker image

and have no outside you know, Key Vault or something.

Only this way you could then have the environment secrets in the Docker container,

but I don't think you want that. Yeah. Right.

You want something starting it with the secrets as an

environment for that image when it starts. Yeah, injected. Yeah.

So the secrets should be injected. Yeah. So for local

deployment, I mean, that's what I'm doing most of the time these days with Kamal,

where I have on my local machine, I fetch these secrets from

the password manager, it gets injected as Kamal deploys

the image, and then afterwards the secrets are gone also

from my local environment.

If you want to have a more CD approach, then yeah, either store

them in GitHub Actions and then use them while you deploy from GitHub Actions,

or if you have something where somebody deploys an image for

you, then they most likely will have also a Key

Vault where you can set these environment variables. Fly, for example, they have Fly secrets.

So you can just set them there and then they get injected. I believe,

like, I think maybe on Scaleway, which is what I'm using,

and Hetzner, I also use Hetzner, they might also have

key, like I know on Scaleway, they have key vaults that you can use.

So you can probably put your environment variables into the key

vault of whatever hosting provider you use. And then

give your Docker image just like a temporary token that it could

use, maybe. You know, there could be a way there,

if the Docker image starts up, it has either,

like somehow it will get a temporary token and then it can connect

to the Key Vault to fetch the environment variables from there. So you

might be able to— Something short-lived. You might be able to build what Fly,

for example, does for you yourself,

but you know, you gotta be a bit more careful then.

Right. So, and you were mentioning the password manager.

So when you deploy with Kamal, it's just invoked

with the scripts that then run the

release. But you mentioned to me earlier that, um, you do

have something similar for your local development as well. What does that

look like? Yeah, so I used to have .env files, and in those

.env files, I would store the secrets. I think we have all done that,

you know, maybe still today, or at least a few years ago,

that's the way you set up local development.

I have since switched also to fetching the secrets from the

password manager as I source the .env file.

So in the .env file, if you replace the actual value with

a call to your password manager, so to

the CLI, when you source the .env

file, it will call the password manager and then fetch the environment

variable and inject it into your local environment. But this way

you never have the actual secrets stored in a plain text file in your application,

in your project.

Right. And that just looks like your .env file then has the

exporting the environment variable, but then

you also have the shell interpolation with the dollar sign

parentheses, and then it's calling the CLI of your password manager.

And then When you source it, you get that little popup from your

password manager that says, do you want to authorize this? Something like that. Yeah.

And I also use that for my dev container setups because

I run most of my agents when I code locally,

I run them in a dev container. So that's a Linux container running on my

computer. And I have a GitHub project there.

If you go to pjulbricht/devcontainer, or you can also go at pushin.eu/pjulbricht/get-devcontainer.

I think I migrated it. In there, you will find a devcontainer.json.

And that is the configuration file for the actual dev container.

And in there, I'm setting environment variables,

either secret or public. You know, if they're public, they're just baked into that file.

If they're secret, they pull that environment variable from the

environment of the shell session that you use

to start the dev container. So this way, if I,

because you might not need all the environment variables in your actual

dev container. So you only need maybe 1 or 2, but you have 10 for

your, you know, because locally I need more environment variables to maybe deploy or

do some other CLI work. But in the dev container, I only need 2.

So I can inject them from my local session into the dev container.

And then the agents can work inside that dev container, but they

don't have access to the real environment outside of it. Nice.

Yeah, that makes a lot of sense. And then With

your projects, then you are committing your .env files, presumably?

No, I do not. No. You still don't, even though

it's not including any— Right. I mean, by now I could,

but I usually don't. If I need to share the

.env file with another developer, I'd rather create an example

.env file. And then it has,

it has, you know, like, hey, insert this value here or there. So,

so they, the other developer knows which environment variables they need to set,

but the actual values are not in there. But I just didn't have that situation

yet where I needed to share my .env with another developer. But yeah,

I mean, I just, I don't feel good about committing

.env files because maybe in one situation it has a secret

and then it's, you know, online. So I just don't do it. Fair enough.

Did you add it to your global .gitignore then? Something to make

sure it never gets— Exactly. So I would need to remove my global .gitignore for

.env files, and I just don't want to do that. Fair enough.

I guess old habits die hard, huh? They do. Even if it is safe

now. That's true. But I mean, generally,

like my main suggestion here is just to move everything to a

password manager and then use the CLI that most of them now offer.

I mean, 1Password was already. They had that already a year

or 2 ago, or 3 maybe. I use ProtonPass, and they

also added a pretty good CLI, I think a year ago.

So like, the only thing is I also have my SSH keys in there,

which might be even more important than your local development secrets.

If you keep your SSH keys on disk, even if they're encrypted,

it's not a good idea. Because if you get exploited,

You know, by like, for example, we saw that in the JavaScript ecosystem where

there were packages released or published,

malicious packages. And when you downloaded the package,

they have an after-install script that would run,

and that script would just look at your .ssh folder, take everything

that's in there, and upload it to a command and control server by the

attacker, right? So, within seconds, your SSH keys,

private keys, will be in the hands of the attacker. And then all they

need to do is figure out the IPs to your server and then connect to

it through, with that SSH key.

So that was one of my first things where I moved those to ProtonPass,

to my password manager. And now whenever I SSH

into a server, it gets pulled just in that one call from

the CLI. I wished that

in ProtonPass, it would ask me every time it does it, but it does not.

So that's a little bit, nah, I just don't like it. In 1Password,

I know you can set it up in such a way that it asks you

every single time an SSH key is requested.

So, you know, it might also just be a configuration issue in

my case. Yeah, but this way, even if an attacker

gets access to your local computer, which we kind of think of, oh, it's just

my local machine, it's not production, Yeah, still you have secrets

on there that gets you access to production. And if it's just a database string,

you know, the database URL that you have locally to connect to

your production database, like they can extract that and then connect to it directly.

So yeah, let's just keep everything in a password manager.

It's not 100% secure, but it's more secure than just a plain text

file on your computer. Right, right. And I think

these are really good suggestions because, I mean, especially with the JavaScript ecosystem

thing, this isn't exclusive to JavaScript, but it's just seen there because

it's targeted, either packages, popular packages being compromised and

the new versions being able to steal your

secrets. So you just do your npm update or whatever the command

is, and then boom, you're compromised. Exactly.

Um, but I mean, it's, it's a threat that we could see here

in Elixir as well in the Beam community.

Speaking of that, how is

scanning going, Fedor? What's the, um, if we are

thinking about compromised packages, um, we want

to be able to detect those. If I am a solo

developer and I want to protect myself and scan all of my packages

before I download and install them, how do I go about that?

If you want to scan all your dependencies, you mean? That you pull down.

Well, good luck. I mean, sure.

I'm, this is probably more for the, uh, the enterprise,

uh, know every dependency, get it approved by,

uh, security type of corporate security policies.

As an independent developer, I'm not going to do that, but it might give me

peace of mind to just run it once, once or twice, or to have you

run it every once in a while. Oh yeah. Yeah, yeah, sure. So I run

security scans on my application, like Pushin, which is my main application right

now. I run it every week or two. Like, I run a full,

not full, but like, I focus on subsystems and then I

use Daybreak Blue, which is OpenAI's cyber defense model.

And now I can also use Mythos 5.1, and I just tell it,

hey, go look at the subsystem and find security vulnerabilities in there.

So I found, like, I did that last week with Pushin,

and I found like 50, 60 reports. None of them

were severe. Most of them were like in this particular

situation, yada, yada, yada, you know, somebody can still make a push after

they were blocked, for example. So I fixed them and

I feel, you know, better about doing that. And I hope I'm

going to rescan like in 2 weeks, you know, to see what falls out.

So that's what I'm doing. These models have become good enough,

even if you just use Opus 5.5 or if you use SOL 6.1.

Although I use Opus 5.5 more, they're good

enough to find most of the vulnerabilities, right?

So that's a good approach. Just in OpenAI

and Codex, you have a plugin from Codex Security that you can

install, and that gives you these security

scan and security deep scan skills. I usually

run the security scan one. It's a bit simpler.

So that's what in Codex. In Claude, I think you also have a security review

skill, but there, I'm not sure how good it is,

to be honest. I wrote this blog post a while back

where I also shared my prompt that I'm using when I do these scans.

So you can just use that prompt, give it to Claude and say,

scan this library or this application based on this prompt.

And what I'm doing in my scans is usually I go through the project

file by file, so one file at a time, and you

can write, you know, a 10-line Bash script to do that for you, where you

just fetch the .ex or .exs files or .hex

files. Hex is not that important really, but .ex and .exs files,

and then you feed these files one by one into a new Claude

session, and you just tell it with a prompt, you know, find me some

security stuff, and then write it to a Markdown file with the unique ID so

that you can reference it later. So that is something you can write in like

half an hour. And with Opus 5.5, like you will also not use that many

tokens to do that. So you can just run it while you work

on something else. And if you run that every 2 weeks, once a month,

you know, I guarantee you, you will find and continue to find

severe security vulnerabilities in your application,

but then also bugs, which is nice, you know, to find these kinds of things.

So that's good, but that's— Right.

Yeah. For those skills

that you mentioned from OpenAI and from Anthropic,

they are essentially just an

opinionated set of instructions for how to do

those scans, right? And it's similar to what you were just describing with

your opinionated set of instructions for So have you, have you seen much

benefit between the two? Is it worth it to personalize? Is it

good enough to just go with the built-in skills?

Yeah. So one of the biggest takeaways is

to not just point an LLM at your entire

codebase and say, go find vulnerabilities.

You know, that will find you some vulnerabilities, but certainly not everything.

So what you need to do in any case is to break down

the application into subsystems or into files

as I'm doing most of the time for smaller projects,

and then just have every single file sent to Claude,

but also allow Claude or Codex, but allow these LLMs

to also look for code calling that

module. Right. So not, you know, say only look at this file,

but also say, see where this file is being called from.

So this way it can understand whether It's, you know,

a little function somewhere very deep down the application that nobody else

calls except for one other function that is slightly higher up

the stack, or whether this is a publicly exposed function that everyone can call,

right? Those are very different threat models here.

So, but it does it by itself, really. You know,

the only thing is scope it down to something that is small and then

rather use multiple sessions to iterate through the files

or the subsystems that you have. And all these skills,

they basically do that. So if you also look at the security scan

skill, it will also spin up different subagents that all look at

different parts and so on. So it's all a divide

and conquer approach to finding vulnerabilities.

Right. I guess it sounds like when you start it with a more limited scope,

it'll divide and conquer in smaller pieces that might be able to pick up things

that if you just started it over your entire project, it might not.

Get to that granular level. Yeah. And just a recent

example of this, I used Mythos 5.1

to scan a pretty big library in the space.

And I first gave it kind of like the whole project approach.

So I just pointed Mythos at that project and said, find me

vulnerabilities. And it went off and spent a lot of tokens and it

came back with, I think, 4 vulnerabilities.

And 2 of them were proper vulnerabilities.

2 of them were more bug fixes, slash maybe a vulnerability,

nothing severe. And then I did the same with Opus 5.5,

but I had Opus 5.5 iterate through every single file and just

do it one file at a time. And I still need to review them,

but there were 20 reports instead of 4. Hmm.

So, and I've seen that many times now. So if

you just point an LLM at a project in general and say, go find me

vulnerabilities. Yeah, it will come back with 4, even if it's— because he,

I tried this approach with Mythos because I thought, well,

Mythos is what everyone says, super, like it can, it can contain

a lot of context. It can handle big applications.

And yeah, it didn't do that well, to be honest, you know?

So I think even there, you're better off pointing it at subsystems

or individual files and then have it Uh, find the vulnerabilities.

Right. And how do you feel like in

the confidence level of those 20 Opus

vulnerabilities that it found versus the 4 Mythos?

Like, is it 20 junk or 16

junk ones and it caught the 4 that Mythos also did? Or how do you

feel? Yeah, usually, what was your experience? Usually I have like a 20, 30,

sometimes 40% hit rate. with vulnerabilities. So,

if I take 20, if I have 20 reports, I'm pretty sure out of 20,

there will be like 5 CVEs maybe falling out.

So, that's already more than Mythos, where only 2 out of 4 reports

probably will be a CVE. Right.

Very interesting. And with the access

to Mythos that you now have, I think I heard, or you posted on socials

recently, that you scanned Phoenix. And found no vulnerabilities.

Is that right? Nothing new. Yes. I rescanned Phoenix.

Actually, I have been rescanning Phoenix almost with every new model that comes out,

and time and again, it doesn't find anything severe

critical, right? So I'm still waiting for that day where out of a sudden,

a new model comes out and says, yeah, this is massive, massive vulnerability in

Phoenix that everyone has overlooked so far,

but it just hasn't happened yet. So, Fingers crossed.

Kudos to the Phoenix team for doing that,

but like fingers crossed. I'm hoping,

and I'm sure you're hoping, that we start to see like the tail of

LLM security vulnerabilities. Yes,

they're still going to exist, but they're going to get harder and harder and harder

and harder to find. So let's build

a more secure ecosystem. That's what's happening right now. Yeah.

bigger issue here is breadth versus

depth right now. So I scan a few libraries quite often and

like the biggest ones, I scan them quite often. I don't

find that much anymore. Sometimes like Decimal had a CVE,

you know, so that kind of stuff. But yeah,

now like now I kind of need to go into more the broad aspect.

I need to go down the long tail of libraries, right? Because even if you

use a small library that doesn't have as many downloads as Phoenix,

for example, it might still be very critical to

your stack or to your application, and it might have a vulnerability that

is severe, right? Right. And that's

the case where your recommendations earlier on how to run security scans might be useful

for people listening to the podcast, because if you have those

dependencies that you, in addition to your own applications,

that you want to check for security vulnerabilities, something that hasn't been

On the, what is it, the top 100, top 1,000 packages that

you've scanned on Hex? Yeah, ideally scan

them yourself, especially when they're kind of critical,

when they take external input. You know, if it would be

like Ecto, I mean, Ecto is important,

but it's also very low down in the stack. Like you will almost never give

a user direct access to any Ecto functions. It always goes through the

LiveView or Phoenix controller context, whatnot. So you have some

layers of protection there. Yeah, we also, I didn't find too

much in there. So, so basically think about your library,

have it like, just again, point Opus or Codex at it and say,

find me some vulnerabilities, fix them.

If there are actual vulnerabilities, you know, if you, if you think people are,

could be affected by this, send us a Slack message or an email,

and then we can create a CVE for you so that people get notified about

this critical change and can upgrade to the fixed

version, right? But yeah, I think it's just like— Who

is the us that you're talking about? Oh, that's me and Jonathan. So it's

2 people. And why

you 2? What's special about you 2? Well, we are working

for the EFF to do this. Jonathan is officially the CISO, Chief Information

Security Officer of the EFF. Um, he works full-time and more than full-time on

this. I work part-time on it, but yeah, you,

you, you can contact either of us and we help you further.

Right. So you two are the point of contact for Erlang

ecosystem security. Basically. Related questions.

So you two are, thanks again. I think, I feel like I say this

every episode, but thanks again to you both for the hard work, 'cause it's not,

it's, um, I, I remember it was

after ElixirConf EU and we were sitting in the,

um, the hacker room, hacker apartment.

Yeah. The hacker apartment from the Ash folks. And,

uh, you're just like, hey, I just threw Claude to go

scan, I think it was Decimal. Yeah. And you're like, Decimal,

there's actually a vulnerability here. It can crash your system. It's a big one.

Then you ran it and then it crashed your system. Yeah. It had like 8

gigabytes of RAM.

Yeah. But I don't know. I mean, to be honest, I see this whole work

as one contribution to the ecosystem, right? It, like, there are many different

ways of contributing to the ecosystem. The most obvious one is writing code

and releasing it and helping others use it. But also what I'm doing,

scanning stuff and reporting vulnerabilities, is another way of contributing,

you know? And then you have brilliant people who write blog posts about what they

work on. I think that's also a great contribution to the ecosystem.

So. You know, just because I'm doing this doesn't mean that this

is the only way of contributing, like by far not. Of course.

Of course. But it helps everyone. So we need

to make sure that we let you know how thankful we are for it.

So yeah, thank you. Just don't, don't be

mad at me when I approach you about a vulnerability that, that helps me the

most. Nightmare scenario, getting a cold outreach

from Peter. Yeah, I know when people get Slack messages from me now,

it just says, hi, like They're ready.

Their heart rate goes up a little.

Yeah. All right. Well, Peter, this has been a fun discussion,

but unfortunately, I think you have things to do. I have

things to do. It's been more of an interview than a discussion, but maybe next

time we have something actual to discuss again. Fair enough.

Yeah. Well, with that, thank you very much everyone for staying

until the 1-hour mark. As always,

thank you for listening. Subscribe if you haven't,

and otherwise we will see you back in 2 weeks, which will

be after Codebeam Europe, I believe.

So we'll get a little bit of a conference report. You're going? I'm going.

I'm speaking on the 22nd together with Jonathan about our work

of vulnerability research, vulnerability work at EFF.

So I'm there. If you're there too, You know, say hi to

me. I'm approachable. I like talking to people. So just, you know,

say hi. Don't be a stranger.

And then see you in 2 weeks again. Thank you for tuning in. Bye-bye.

007 - Goatmire, Old Android Phones, and How To Keep a Secret
Broadcast by