Skip to content
This repository was archived by the owner on Oct 24, 2025. It is now read-only.

Commit b0a50ee

Browse files
committed
blog: New 2025 deep dive article
Signed-off-by: Ikey Doherty <ikey@serpentos.com>
1 parent a6f1043 commit b0a50ee

2 files changed

Lines changed: 296 additions & 0 deletions

File tree

2.41 MB
Loading
Lines changed: 296 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,296 @@
1+
---
2+
title: Hello 2025
3+
date: 2025-02-06T22:05:55Z
4+
authors: [ikey]
5+
categories: [news]
6+
---
7+
8+
**TL;DR**: Serpent OS is facing funding challenges but development continues. Alpha2 is coming soon with an improved installer. We're seeking community support through donations and volunteers for key roles. Our technical roadmap includes versioned repositories, immutable OS features, and improved package management workflows.
9+
10+
---
11+
12+
We had a flurry of activity around the Christmas period, including our first alpha release as well as
13+
enabling offline rollbacks early in January. We're actively working on alpha2, but we also need to
14+
talk about the elephant in the room.
15+
16+
## 🐘 The elephant in the room
17+
18+
Recently I posted a [tweet](https://x.com/Serpent_OS/status/1886715364744007935) that has been covered
19+
by a few news outlets. The long and short is quite simple: distinct lack of funds. A *very long* story
20+
short: a change in my contract led to a loss of income protection, combined with a herniated disc (C6-C7),
21+
culiminated in having to resign. Naturally I've been working exclusively on Serpent OS since then, but
22+
I've also got to keep the lights on at home.
23+
24+
{{< giphy "ZGH8VtTZMmnwzsYYMf" >}}
25+
26+
This doesn't mean the project is closing or anything like that, but it does mean that I actively need to keep
27+
costs down whilst using daytime hours for financing. This is what's led to the significant slowdown in the
28+
last few weeks, and I'm just trying to be as transparent as possible and manage expectations.
29+
30+
### 💼 But couldn't you just get a job?
31+
32+
Sure. The reality is that with a job, and kids, there's very little time left for Serpent OS. I personally
33+
believe very strongly in Serpent OS, and I want to see it succeed. As a truly independent project, we're
34+
in a unique position to do things that other projects can't. We haven't got to answer to shareholders, or
35+
concern ourselves with market share. We can focus on making the best possible OS for our users.
36+
37+
But it's not *just* that. We're building the tools so that others can build *their* vision of the best OS.
38+
Or provide applicances. Or <insert your idea here>. We're building a set of tools and principles to facilitate
39+
innovation and disruption, for projects of any size. We're not just building an OS, we're building a platform.
40+
Bring your own distro, if you will.
41+
42+
My sincere hope is that others also believe in this vision, and can help us get there. It's make or break time,
43+
and you have the power to help us make it.
44+
45+
### 💰 Funding
46+
47+
OK, so how can folks help? The most obvious one is funding, so we'll get that out of the way first. Right now
48+
it's possible to support us via [Ko-fi](https://ko-fi.com/serpentos) or [GitHub Sponsors](https://github.com/sponsors/ikeycode).
49+
For the sake of transparency, as noted on the [Sponsor](/sponsor) page, we haven't got an established company
50+
or business bank account. In time, we're looking towards something more cooperative. For now, the reality is
51+
the daily running and development largely falls on me.
52+
53+
### 🏗️ Infrastructure
54+
55+
One way that we could certainly cut some costs, and improve scaling, is through additional infrastructure.
56+
We're currently hosted on a single Hetzner server, and we're looking to expand that to a more distributed
57+
setup. Rune Morling currently hosts 2 of the builders in his home at his own expense, and the main server
58+
is also the primary builder, which is less than ideal.
59+
60+
We need to split the repository hosting as its grown enormously, and could do with a few more builders to
61+
facilitate "try builds" of pull requests.
62+
63+
Lastly we're looking at CDN solutions to improve the speed of package downloads (efforts currently ongoing).
64+
65+
### 👥 Roles and responsibilities
66+
67+
We're growing quickly and that comes with some pain points. We're looking for immediate help in the following key areas:
68+
69+
- **Community management**: Someone to manage social media, forums, and other community platforms.
70+
- **Documentation**: Once we pivot to Astro + Starship, we'll need to focus on adding high quality documentation.
71+
- **Translation**: We're enabling gettext + fluent where appropriate, and will need extensive translation work.
72+
- **Web development**: We need to improve our web presence, management of web properties, transition to Astro, etc.
73+
74+
While of course we'd also love more developers and packagers, most of the time is spent in these areas already, and the other
75+
roles desperately need attention.
76+
77+
## 🚀 Latest developments
78+
79+
Before we get into the future, let's talk about what we've been working on lately.
80+
81+
### 💾 Disk Management (disks-rs)
82+
83+
A couple of weeks back we broke the news that we were working on a new disk management library, `disks-rs`.
84+
The scope wasn't made quite clear at the time, but it's another building block to facilitate smarter applications.
85+
Eventually we want to support the manipulation of various filesystems and disk structures, for use in CI pipelines, etc.
86+
87+
Another requirement for disk-rs is to not only expose sane partitioning logic, but also to provide a way to declaratively
88+
define disk layouts. This will be used in the installer, but also for reproducing entire installations. It forms the basis
89+
for our future provisioning system.
90+
91+
Right now we're working on a very cool [`.kdl`](https://kdl.dev) based format for defining disk layouts. It takes advantage
92+
of `kdl-rs` streaming parser to implement a procedural syntax complete with miette error handling for a very nice developer
93+
experience:
94+
95+
```kdl
96+
// Create a partition table. Defaults to GPT
97+
create-partition-table type="gpt" disk="root_disk"
98+
99+
// Create the ESP
100+
create-partition disk="root_disk" id="esp" {
101+
constraints {
102+
min (GB)1
103+
max (GB)2
104+
}
105+
type ...
106+
}
107+
```
108+
109+
### 🛠️ Installer
110+
111+
Our installer has quite a nice backend, but honestly the frontend experience leaves a lot to be desired. Given that our current
112+
focus is being able to not only onboard developers but build tooling against an installed system, we need to make the core of
113+
this effectively scriptable. To do so will build upon ongoing IPC work for moss and disks-rs, and the introduction of a new GUI
114+
frontend based on [Slint](https://slint.dev/). While early days we're trying to think 10 miles down the road, where we can utilise
115+
the LinuxKMS backend for minimal installer ISOs.
116+
117+
Early preview:
118+
119+
![Installer preview](Featured.png)
120+
121+
122+
## 🔮 The road to stability
123+
124+
So we have some exploratory works in progress, and it's time to discuss how they all relate to the future of Serpent OS.
125+
You'll immediately notice that these are highly circular in nature, meaning we need to switch between different areas
126+
routinely. In order to design an effective architecture, whilst minimising disruption, we need to have a clear vision
127+
of the future that we're referring to as "10 miles down the road".
128+
129+
### 📚 Versioned repositories
130+
131+
As previously explained, one of the built-in mechanisms to support a rolling release with breaking changes to the format is to introduce
132+
explicitly versioned repositories. Long story short, a local `moss` client will only "see" the latest version of the repository that it can
133+
actually use. Breaking changes will mean format bumps, and newer repository versions will be unavailable until the client has updated to
134+
a client/Serpent OS version that actually supports it.
135+
136+
This work requires changes to the repository format, infrastructure, and a migration path from the current repository to a new
137+
archive. However, it is also dependent on having a new format version being available for the versioned-indices.
138+
139+
### 🔒 Immutable OS
140+
141+
Frequently Serpent OS is described as an immutable OS, but in actuality it is an **atomic** OS. That means we've focused entirely
142+
on providing a reliable update mechanism, rollbacks, etc. We have not yet enforced immutability, aka a read-only root filesystem.
143+
144+
Our plan is heavily inspired by [composefs](https://github.com/containers/composefs). Currently `moss` produces new filesystem trees
145+
using a hardlink farm approach, and relies on `renameat2()` to atomically switch the root filesystem. This is a very fast operation,
146+
but does not provide immutability.
147+
148+
Leveraging the ability of moss to dynamically construct filesystems from packages, it will be abstracted into a driver mechanism. This will
149+
allow the classic hardlink approach for buildroots, but employ a new `erofs` strategy for immutable installs. The newly generated
150+
`erofs` image will essentially rely on extended attributes to "point" to the underlying content addressable storage, and utilise
151+
`overlayfs` to present a read-only view of the filesystem. Further building on this we'll use so-called "mount tucking" to provide
152+
the mechanism for atomic updates without the need for a reboot.
153+
154+
#### 🤔 Why not use composefs?
155+
156+
We're actually going to make moss support exports to composefs format, making it an ideal match for `podman` use cases, deduplicating
157+
the image content. Whereas `composefs` produces content from an existing tree, we've already got content addressable storage, independent
158+
transactions and databases to facilitate this. This means we'll be able to retain our composition features and very quickly produce the
159+
new `erofs` images. Using `composefs` directly would significantly slow down the time to produce each transactions, whereas we can instead
160+
build a similar internal functionality and integrate at higher levels.
161+
162+
We also plan to integrate the file digests in a new revision of the moss `stone` format, which will open the door to supporting
163+
SELinux xattrs, as well as `fsverity` for the immutable images.
164+
165+
Note that this goal will inform the requirements for the next stone format, which will in turn require versioned repositories.
166+
Of course, this also impacts the build pipeline infrastructure.
167+
168+
### 👷 Maintainer burden
169+
170+
Truly the most time consuming task in most distributions is the *cost* of maintaining packages. This is being approached, as with all
171+
of the planned goals, in an incremental fashion. However, it often pays to have a view 10 miles down the road to determine exactly how
172+
to get there.
173+
174+
#### 🧬 ABI Tracking
175+
176+
In order to provide sanity for developers, and make guarantees about the stability of the system, we need to track the binary ABI for
177+
all packages. Furthering on this, we can of course immediately detect any breakage and schedule rebuilds as appropriate. This will also
178+
add a higher degree of confidence for pull requests as we'll know if its consistent or introducing problems.
179+
180+
#### 🔄 Pull Request workflows
181+
182+
The workflow for packaging right now is for someone to open a pull request, which contains their recipes, the automatic "build records" (manifest)
183+
and our assumption that they built it using a local repo based on top of the latest repository. What is actually needed here is for the infrastructure
184+
to perform automatic (low priority) builds of each pull request in a *transient* repository, making those builds available for verification
185+
purposes.
186+
187+
#### ⚛️ Atomic repo merges
188+
189+
Another limitation with the current infrastructure is the reliance on a global build queue. Simply put, once a PR is merged, all of those builds
190+
are scheduled and individually published to the target repository upon completion. This is very naive, and leads to a lot of "nannying" in the
191+
event of a failed merge.
192+
193+
In future, those builds will be scheduled in a transient repository, and upon successful completion the resulting artefacts would be published
194+
to the target repository in a single atomic operation. This will also allow for the introduction of "try builds" for pull requests.
195+
196+
#### 🩸 The bleed-through problem
197+
198+
Another issue which partially relates to bootstraps, is the bleed through problem. This is an artefact of using layered repositories, such as a local
199+
repository, to build updates that would change the providers available in the underlying repository upon merge. Take for example, LLVM.
200+
201+
```
202+
main repo:
203+
├── rust [runtime-depends: libLLVM-18.so]
204+
└── build-dep: binary(rust) [runtime-depends: libLLVM-18.so]
205+
206+
local repo:
207+
├── rust [runtime-depends: libLLVM-19.so]
208+
└── build-dep: binary(rust) [runtime-depends: libLLVM-18.so]
209+
```
210+
211+
After completion of libLLVM-19.so, the local repository would contain the new version, but the main repository would still contain the old version.
212+
Locally this would allow the circular build dependencies to work as `rust` builddep for `rust` could still resolve `libLLVM-18.so`. However, upon,
213+
merging to the repository, we have a new problem. The main repository would now contain `libLLVM-19.so`, but the `rust` package would still be
214+
built against `libLLVM-18.so`. This then breaks the dependency chain for `rust`, requiring manual intervention.
215+
216+
To solve this, we'll ensure that **filtered** repository views are introduced both for local builds and our build infrastructure. This will mean
217+
that the index of the local repository will *occlude* the main repository, and eliminate bleed-through.
218+
219+
#### ⭕ The bootstrap problem
220+
221+
Whilst ABI tracking is very important, it doesn't actually solve the bootstrap problem of circular dependencies. This is a consequence
222+
of using an incremental development model for a binary-first distribution. In reality the only real way to solve this is by eventually
223+
altering the tooling to support a "world view", with intermediate recipes that are not published to the final repository. In effect, combined
224+
with ABI tracking for dependency chain invalidation, we can determine which recipes need to run again as part of an invaldation-solver loop
225+
that relies on "cached artifacts", i.e. the final packages.
226+
227+
This isn't an immediate issue to solve, but it will inform our next steps to ensure we get to that point without requiring extensive
228+
overhauls or "stop the world" rewrites. Our eventual vision is that building any new package will feel much like it does now, but changing a
229+
reverse dependency will evaluate the dependent chain for rebuilds. To make this streamlined, the infrastructure will by this time have
230+
grown to a point where we can share the compute power by way of so-called "try builds", and a shared cache of artifacts.
231+
232+
#### 📦 Keeping the packages up to date
233+
234+
A large portion of the burden is in reality chasing updates. Currently we have a very simplistic utility that cross-references
235+
[release-monitoring.org](https://release-monitoring.org) to spit out a list of recipes that have available updates. Truthfully
236+
we could **easily** generate diffs for these updates, and even automate the process of updating the recipes. This is dependent
237+
however on having confidence in the pull request, which in turn is dependent on ABI tracking being in place.
238+
239+
### 🗂️ Organising it all
240+
241+
We have a complex series of interdependent goals, which require research and frequently shifting between focus areas. Not all of them will be immediately realised,
242+
and some are simply informing the direction for our future. Additionally, we need to keep moving without any "rewrite the world" pauses.
243+
244+
It's important to highlight that none of this is a reinvention of the project, but a series of steps to "1.0" and beyond to ensure that
245+
the project is sustainable and reliable. This means that delivery continues, and the delivery itself becomes simpler and more trustworthy.
246+
247+
Despite the interdependencies, once we've finished scoping the end requirements we can work towards the immediate concerns:
248+
249+
- Pull request workflow
250+
- Repository *consistency* (initially ABI story)
251+
- Update automation
252+
- Immutability
253+
254+
Note: These timelines are estimates and may adjust based on available resources and community support.
255+
## Scale-up considerations
256+
257+
We're at the point where we need a functional OS for contributors to be able to work on the project. It also presents a paradox because
258+
we wish to keep the project lean whilst we work on extending the scale-out capabilities. In reality this means that we're going to permit
259+
a **limited** amount of repository growth:
260+
261+
- Addition of the Plasma desktop for daily use
262+
- Container-management tooling (podman, docker, etc)
263+
- Development tools (IDEs, etc)
264+
- Onboarding requirements (such as Matrix clients, documentation, etc)
265+
266+
This in turn also requires a more reliable installation experience, which is why we've been spending cycles on the installer project.
267+
Internally we want the installer to support a variety of scriptable configurations in order to provide better test coverage for our updates
268+
and boot management, whilst we also intend to **incrementally** improve the user experience.
269+
270+
## 📅 Conclusion
271+
272+
Alpha2 is coming, and will feature a preliminary version of the updated installer. The plan initially is for a simple "use whole disk" strategy
273+
and will be followed up with supported for encrypted installations (post alpha2). Quite simply, some employers require their developers have encrypted installs,
274+
and not supporting this configuration will restrict our ability to onboard developers.
275+
276+
We're doing the Alpha2 as a baseline, from which all update testing, infrastructure adjustments, etc, will be measured against. This is the
277+
point at which the project will formally "open the doors" for more developers and testers, with the explicit view that growth is
278+
sustainable and manageable. Per the requirements set above, we're not going to "explode", but enable specific workflows that in turn will permit
279+
us to scale out the project and inform direction.
280+
281+
It's important to me that we're explicit in how we take our next steps. As stated earlier, pausing the world is not an option.
282+
Continued delivery whilst enabling an incremental path to the future is the only way to ensure that we can deliver on our promises.
283+
Contrary to a reboot, this is a solidification of our vision and a commitment to the future. Sure, new features will also appear in time,
284+
such as easier packaging recipe formats, but no decision is being made that will require a rewrite of the project. However, these goals
285+
require stating and explaining up front so that the high level vision is clear and provides the context for any short-term deliverables.
286+
The last thing we need is to be in a position where we're "stuck" and unable to deliver, due to a lack of foresight.
287+
288+
## 🙏 Thank you
289+
290+
On behalf of the project, I'd like to thank everyone who has supported us so far. Whether that's through donations, code contributions,
291+
or even having the time of day to try out the ISO, it's deeply appreciated. Being the underdog comes with its own set of challenges,
292+
and of course the "indie cost", but it's also an opportunity to challenge the status quo and find new, more optimal ways, to do things.
293+
294+
We're not just building "Serpent **OS**", we're building a set of tools to solve the problem of distributing an OS. Way down the line this
295+
will be powerful enough to support a number of use cases, from appliances to desktops, and even servers. In short, we want to bring high
296+
quality tooling to the masses, and we're doing it in a way that's sustainable and reliable.

0 commit comments

Comments
 (0)