blog: The Immutable Workstation - Fedora Kinoite
This commit is contained in:
parent
be69a22174
commit
383f9d0bad
2 changed files with 97 additions and 8 deletions
9
package-lock.json
generated
9
package-lock.json
generated
|
|
@ -2138,7 +2138,6 @@
|
||||||
"resolved": "https://registry.npmjs.org/astro/-/astro-5.16.10.tgz",
|
"resolved": "https://registry.npmjs.org/astro/-/astro-5.16.10.tgz",
|
||||||
"integrity": "sha512-mBaRwFrqwCHiKDvvfNW2rRRkLAqnkj3lbkte6Vg4OzeUiDyEsdU4oOqTZxHJf/mxzZvBiU37BxG1oeh+tq1IUA==",
|
"integrity": "sha512-mBaRwFrqwCHiKDvvfNW2rRRkLAqnkj3lbkte6Vg4OzeUiDyEsdU4oOqTZxHJf/mxzZvBiU37BxG1oeh+tq1IUA==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@astrojs/compiler": "^2.13.0",
|
"@astrojs/compiler": "^2.13.0",
|
||||||
"@astrojs/internal-helpers": "0.7.5",
|
"@astrojs/internal-helpers": "0.7.5",
|
||||||
|
|
@ -4722,7 +4721,6 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"nanoid": "^3.3.11",
|
"nanoid": "^3.3.11",
|
||||||
"picocolors": "^1.1.1",
|
"picocolors": "^1.1.1",
|
||||||
|
|
@ -4790,7 +4788,6 @@
|
||||||
"integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
|
"integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"bin": {
|
"bin": {
|
||||||
"prettier": "bin/prettier.cjs"
|
"prettier": "bin/prettier.cjs"
|
||||||
},
|
},
|
||||||
|
|
@ -5125,7 +5122,6 @@
|
||||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz",
|
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz",
|
||||||
"integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==",
|
"integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/estree": "1.0.8"
|
"@types/estree": "1.0.8"
|
||||||
},
|
},
|
||||||
|
|
@ -5400,8 +5396,7 @@
|
||||||
"version": "4.1.18",
|
"version": "4.1.18",
|
||||||
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz",
|
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz",
|
||||||
"integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==",
|
"integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==",
|
||||||
"license": "MIT",
|
"license": "MIT"
|
||||||
"peer": true
|
|
||||||
},
|
},
|
||||||
"node_modules/tapable": {
|
"node_modules/tapable": {
|
||||||
"version": "2.3.0",
|
"version": "2.3.0",
|
||||||
|
|
@ -5849,7 +5844,6 @@
|
||||||
"resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz",
|
||||||
"integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==",
|
"integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"esbuild": "^0.25.0",
|
"esbuild": "^0.25.0",
|
||||||
"fdir": "^6.4.4",
|
"fdir": "^6.4.4",
|
||||||
|
|
@ -6048,7 +6042,6 @@
|
||||||
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
|
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
|
||||||
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
|
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/colinhacks"
|
"url": "https://github.com/sponsors/colinhacks"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
96
src/content/blog/immutable-workstation-fedora-kinoite.md
Normal file
96
src/content/blog/immutable-workstation-fedora-kinoite.md
Normal file
|
|
@ -0,0 +1,96 @@
|
||||||
|
---
|
||||||
|
title: "The Immutable Workstation - Fedora Kinoite"
|
||||||
|
description: "My journey with atomic desktop from Fedora"
|
||||||
|
date: 2026-02-20T13:08:00+07:00
|
||||||
|
draft: false
|
||||||
|
tags:
|
||||||
|
- linux
|
||||||
|
- fedora
|
||||||
|
- engineering
|
||||||
|
- developer_experience
|
||||||
|
---
|
||||||
|
|
||||||
|
There’s a specific kind of anxiety that comes with running a system upgrade on a deadline. You’re not just updating a browser; you’re shifting the ground beneath your IDE, your compilers, and your carefully tuned environment. One bad dependency, and your afternoon is gone.
|
||||||
|
|
||||||
|
Lately, I’ve been looking for a way to stop fighting my OS. I wanted a workstation that felt less like a house of cards and more like a solid piece of hardware.
|
||||||
|
|
||||||
|
Enter **Fedora Kinoite** (using version 43 as of this post).
|
||||||
|
|
||||||
|
### The "Atomic" Difference
|
||||||
|
|
||||||
|
Fedora 43 Kinoite isn't your typical Linux distro. It’s an **Atomic Desktop**.
|
||||||
|
|
||||||
|
Instead of a traditional package manager that swaps files out one by one, Kinoite uses `rpm-ostree`. Think of it like Git for your operating system. When I update, the system pulls a brand-new, verified image in the background. My current environment stays untouched until I reboot into the new one.
|
||||||
|
|
||||||
|
If an update breaks a driver or a core library? I just select the previous deployment at boot, and I’m back to work in seconds. It’s a built-in "undo" button for your entire OS.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Where the "Atomic" Life Shines
|
||||||
|
|
||||||
|
If you're a developer, the Atomic workflow solves problems you didn't even realize you had:
|
||||||
|
|
||||||
|
- **Disposable Databases:** I need PostgreSQL for my Spring projects, but I hate background services eating 200MB of RAM 24/7. In Kinoite, I run the database in a **Toolbox**. I start it when I code; I kill it when I’m done. My host OS stays "database-free."
|
||||||
|
- **Version Manager Heaven:** By keeping the system root read-only, you’re forced to manage Node, Java, and Flutter in your Home folder. This creates a clean separation that makes your entire dev-stack portable and incredibly fast.
|
||||||
|
- **Home-Run IDEs:** I run heavy IDEs (Android Studio, Antigravity, VS Code) as "Home-run" apps. I extract them directly to `~/.local/apps`. They get native performance without "sandboxing" headaches, but they never touch my system root.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Getting Started: Building Your Stack
|
||||||
|
|
||||||
|
If you want to try this "Hybrid-Atomic" approach, here is the toolkit I’ve found most effective. Every one of these tools lives in your home directory, keeping your system image pristine.
|
||||||
|
|
||||||
|
#### 1. Node.js via [fnm](https://github.com/Schniz/fnm)
|
||||||
|
|
||||||
|
Forget NVM; `fnm` is written in Rust and is near-instant.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -fsSL https://fnm.vercel.app/install | bash -s -- --install-dir "./.fnm" --skip-shell
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2. Java via [SDKMAN!](https://github.com/sdkman/sdkman-cli)
|
||||||
|
|
||||||
|
The gold standard for JVM developers. It handles your `JAVA_HOME` symlinks so your IDEs stay synced even when you swap JDK versions.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -s "https://get.sdkman.io" | bash
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 3. Flutter via [Puro](https://github.com/pingbird/puro)
|
||||||
|
|
||||||
|
A much faster way to manage Flutter versions and environments than the standard manual install.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -o- https://puro.dev/install.sh | bash
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 4. The "Glue" (Environment Config)
|
||||||
|
|
||||||
|
The secret to making this work is using `~/.config/environment.d/60-development.conf`. This tells your "Home-run" IDEs where your tools are before the desktop even loads. No more "JDK not found" errors.
|
||||||
|
|
||||||
|
```ini
|
||||||
|
ANDROID_HOME=/home/user/.local/share/sdks/android
|
||||||
|
JAVA_HOME=/home/user/.sdkman/candidates/java/current
|
||||||
|
PURO_ROOT=/home/user/.puro
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### The Verdict
|
||||||
|
|
||||||
|
Running Fedora 43 on my IdeaPad 14AHP10 has been a revelation. Because I’ve only "layered" my shell (Fish) onto the host, the system is incredibly lean.
|
||||||
|
|
||||||
|
I’ve stopped worrying about my OS. I’m just building things again.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **Final Documentation Summary**
|
||||||
|
|
||||||
|
- **OS:** Fedora 43 Kinoite (KDE Plasma 6)
|
||||||
|
- **Shell:** Fish
|
||||||
|
- **Hardware:** IdeaPad 14AHP10 (Ryzen 7 8845HS)
|
||||||
|
- **Method:** Hybrid-Atomic / Home-run management
|
||||||
Loading…
Add table
Add a link
Reference in a new issue