Skip to content

Commit 45ea536

Browse files
committed
feat: update styles and components for improved UI consistency and responsiveness
- Refactored AetherisPage and AuroraPage components to remove unnecessary animations and styles, enhancing performance. - Updated DeviceShowcase component styles for better layout and visual consistency across devices. - Added mobile menu functionality in Header component for improved navigation on smaller screens. - Adjusted HomePage styles for better spacing and responsiveness. - Introduced new translations for "Tray Icons" feature in English and Portuguese. - Modified global CSS variables for color and layout consistency across themes.
1 parent 4bd1f54 commit 45ea536

19 files changed

Lines changed: 502 additions & 278 deletions
58.6 KB
Loading
36.7 KB
Loading
126 KB
Loading
41.9 KB
Loading
65 KB
Loading
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
---
2+
title: 'Aetheris 1.4.0 and 1.4.1: faster resource switching, favorites, richer object detail and a maintainability pass'
3+
description: Aetheris 1.4.0 improves day-to-day Kubernetes browsing with object caching, favorite objects, better status filters, clearer container resource metrics and cleaner Windows packaging. 1.4.1 follows up with Deployment pod states, Service/Ingress detail, and an internal refactor.
4+
date: 2026-07-11
5+
tag: Aetheris
6+
---
7+
8+
[Aetheris 1.4.0](https://github.com/luminusOS/aetheris/releases/tag/v1.4.0)
9+
is out with a release focused on the parts of Kubernetes work that happen over
10+
and over again: switching between resources, returning to important objects,
11+
reading container resource usage, and keeping the app predictable across
12+
platforms.
13+
([1.4.1](https://github.com/luminusOS/aetheris/releases/tag/v1.4.1), a
14+
follow-up release that rounds out object detail and cleans up the codebase
15+
internally, is covered at the end of this post.)
16+
17+
The previous releases shaped the workspace and made the resource table faster.
18+
This one keeps pushing in that direction. Aetheris now does more to preserve
19+
context while you move around a cluster, and it gives frequently inspected
20+
objects a proper place in the interface.
21+
22+
<figure>
23+
<img src="../../img/aetheris/aetheris-1-4-0-workspace.png" alt="Aetheris 1.4.0 resource browser with cached objects and status/column filters." loading="lazy" />
24+
<figcaption>Aetheris 1.4.0's resource browser, with cached object lists and filters.</figcaption>
25+
</figure>
26+
27+
## Resource lists that feel closer
28+
29+
Aetheris now keeps a small in-memory cache of recently loaded object lists.
30+
When you move between resources, namespaces or views, the app can immediately
31+
show the last known objects while it refreshes the live data in the background.
32+
That makes repeated navigation feel much less like starting over every time.
33+
34+
The cache is scoped by cluster context, resource type and namespace, so cached
35+
Pods from one namespace do not leak into another view. It is also cleared after
36+
mutating operations such as creating, applying, scaling, cordoning, draining or
37+
deleting objects. The intent is simple: keep the interface responsive without
38+
pretending stale data is authoritative.
39+
40+
Object loading also has a timeout now. If a cluster or API server stalls while
41+
listing a resource, Aetheris reports the problem instead of leaving the
42+
workspace in an indefinite loading state. When a cached list exists, the app can
43+
fall back to it while still surfacing the error.
44+
45+
## Favorites for the objects you keep opening
46+
47+
Some Kubernetes objects become part of your working set: the Deployment you are
48+
tuning, the Pod you keep inspecting, the Service that anchors a stack, the Node
49+
you are debugging. Aetheris 1.4.0 adds favorite objects so those targets can be
50+
kept close.
51+
52+
The detail header now has a favorite action, and the sidebar can switch between
53+
the regular resource list and saved favorites. Favorites are stored with the
54+
cluster context, resource identity, namespace and object name, which keeps them
55+
precise even when different clusters contain objects with similar names.
56+
57+
<figure>
58+
<img src="../../img/aetheris/aetheris-1-4-0-favorites.png" alt="Aetheris 1.4.0 favorites sidebar and the starred action in the object detail header." loading="lazy" />
59+
<figcaption>Favorite objects in the sidebar, and the starred action in the object detail header.</figcaption>
60+
</figure>
61+
62+
This release also expands the symbolic icon set used by the app. The new icons
63+
make resource groups and actions easier to scan without turning the interface
64+
into a wall of text.
65+
66+
## Better status and metrics signal
67+
68+
The status filter now understands `Available` in addition to the existing
69+
states such as `Ready`, `Unavailable`, `Running`, `Pending` and `Failed`. That
70+
matters for Deployments that are not fully ready but still have available
71+
replicas. Instead of collapsing those cases into a less useful state, Aetheris
72+
can now present partial availability as its own signal.
73+
74+
Container metrics in the object detail view have also been reworked. Pod
75+
containers now show current usage alongside requests and limits in a compact
76+
row. CPU and memory are still formatted into human-friendly values, but the
77+
view is easier to read at a glance and keeps the raw relationship between
78+
current, request and limit close to the container name.
79+
80+
<figure>
81+
<img src="../../img/aetheris/aetheris-1-4-0-metrics.png" alt="Aetheris 1.4.0 container CPU and memory usage shown alongside requests and limits." loading="lazy" />
82+
<figcaption>Container CPU and memory usage, shown alongside requests and limits.</figcaption>
83+
</figure>
84+
85+
Behind that UI, Aetheris now reads resource requests and limits from regular,
86+
init and ephemeral containers. Pod detail loading also fetches summary metrics
87+
and per-container metrics together, which keeps the detail pane from doing more
88+
round trips than necessary.
89+
90+
## Cleaner packaging
91+
92+
The Windows build now embeds application resources directly into the executable
93+
and ships with a dedicated Windows icon. That makes the packaged app feel more
94+
native on Windows while keeping the release workflow smaller and easier to
95+
maintain.
96+
97+
This release also removes the experimental OpenConnect integration. Aetheris is
98+
staying focused on being a native Kubernetes client: kubeconfig, projects,
99+
resources, YAML, logs, terminals and day-to-day cluster operations. Removing
100+
the unused VPN layer cuts maintenance surface and keeps the app's boundaries
101+
clearer.
102+
103+
## 1.4.1: Deployment pod states, Service and Ingress detail
104+
105+
[Aetheris 1.4.1](https://github.com/luminusOS/aetheris/releases/tag/v1.4.1)
106+
rounds out the object detail pane with information that was previously only
107+
one `kubectl describe` away.
108+
109+
Opening a Deployment's Pods tab now shows a small styled summary counting its
110+
Pods by lifecycle phase — Running, Pending, Succeeded, Failed and Unknown —
111+
before you scroll down to the individual Pod list. It's a quick way to spot a
112+
Deployment that is stuck rolling out or has Pods crash-looping without reading
113+
every row.
114+
115+
<figure>
116+
<img src="../../img/aetheris/aetheris-1-4-1-pod-states.png" alt="Aetheris 1.4.1 Deployment detail with the Pod states summary." loading="lazy" />
117+
<figcaption>The Pod states summary on a Deployment's detail pane.</figcaption>
118+
</figure>
119+
120+
Services and Ingresses also get proper sections in the detail pane now.
121+
Services show their ports (name, protocol, port, target port and node port
122+
where set) and their label selector, so you can see at a glance which Pods a
123+
Service actually routes to. Ingresses show their routing rules — host, path,
124+
path type, and the backing Service and port each rule points at.
125+
126+
<figure>
127+
<img src="../../img/aetheris/aetheris-1-4-1-service-ingress.png" alt="Aetheris 1.4.1 Service ports and selectors, and Ingress routing rules, in the object detail pane." loading="lazy" />
128+
<figcaption>Service ports/selectors and Ingress routing rules in the object detail pane.</figcaption>
129+
</figure>
130+
131+
### Under the hood: a maintainability pass
132+
133+
Alongside those features, 1.4.1 includes a purely internal refactor of the
134+
GTK4/Relm4 application layer, with no behavior change of its own. A handful of
135+
files had grown into single, multi-thousand-line modules mixing several
136+
responsibilities at once: message dispatch, application state, widget
137+
construction, YAML tooling, and streaming/terminal handling. Each of these was
138+
split into small, single-responsibility modules — the same pattern already
139+
used elsewhere in the codebase for the object detail view. Message handling,
140+
for instance, moved from one large dispatcher into one file per message domain
141+
(clusters, projects, namespaces, the object table, mutations, nodes, logs,
142+
terminals, port forwarding); application state and window construction were
143+
split the same way.
144+
145+
That part of the release was verified against the full test suite, linted,
146+
and smoke-tested by running the app, and exists solely so future features and
147+
fixes land faster and with smaller, easier-to-review changes.
148+
149+
## Acknowledgements
150+
151+
Aetheris now explicitly credits
152+
[Seabird](https://github.com/getseabird/seabird), whose work helped inspire the
153+
project. Aetheris is still its own GNOME-native take on Kubernetes management,
154+
but it is important to acknowledge the tools and ideas that helped shape it.
155+
156+
If you use Aetheris as a daily Kubernetes workspace, 1.4.0 and 1.4.1 together
157+
should make the app feel quicker when moving around, clearer when reading
158+
Deployment, Pod, Service and Ingress details, and more comfortable when you
159+
keep returning to the same objects.

blog/src/layouts/BlogLayout.astro

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,7 @@ const translateLangs = [
4444
const theme =
4545
saved === 'light' || saved === 'dark'
4646
? saved
47-
: matchMedia('(prefers-color-scheme: light)').matches
48-
? 'light'
49-
: 'dark';
47+
: 'light';
5048
document.documentElement.dataset.theme = theme;
5149
})();
5250
</script>
@@ -154,7 +152,6 @@ const translateLangs = [
154152
position: sticky;
155153
top: 0;
156154
z-index: 40;
157-
backdrop-filter: blur(14px);
158155
background: var(--header-bg);
159156
border-bottom: 1px solid var(--border-color);
160157
}
@@ -265,9 +262,7 @@ const translateLangs = [
265262
padding: 0.9rem;
266263
background: var(--surface-2);
267264
border: 1px solid var(--border-color);
268-
border-radius: 12px;
269-
box-shadow: 0 18px 50px rgba(0, 0, 0, 0.35);
270-
backdrop-filter: blur(14px);
265+
border-radius: 8px;
271266
z-index: 50;
272267
}
273268

blog/src/pages/index.astro

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,10 @@ const withBase = (path: string) => `${basePath}${path}`;
6363
padding: 1.75rem;
6464
text-decoration: none;
6565
color: inherit;
66-
transition: transform 0.2s ease, border-color 0.2s ease;
66+
transition: border-color 0.2s ease;
6767
}
6868

6969
.post-item:hover {
70-
transform: translateY(-3px);
7170
border-color: var(--accent);
7271
}
7372

blog/src/pages/posts/[slug].astro

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,20 @@ const withBase = (path: string) => `${basePath}${path}`;
122122
background: var(--surface-2);
123123
}
124124

125+
.prose :global(.screenshot-placeholder) {
126+
display: grid;
127+
min-height: 18rem;
128+
place-items: center;
129+
border: 1px dashed var(--border-color);
130+
border-radius: 8px;
131+
background: var(--surface-2);
132+
color: var(--ink-faint);
133+
font-family: var(--font-mono);
134+
font-size: 0.8rem;
135+
padding: 1.5rem;
136+
text-align: center;
137+
}
138+
125139
.prose :global(figcaption) {
126140
margin-top: 0.6rem;
127141
color: var(--ink-faint);

blog/src/styles/global.css

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,36 @@
11
:root {
2-
--accent: #3c82f6;
3-
--accent-deep: #2563eb;
4-
--accent-sky: #60a8ff;
5-
--grad-brand: linear-gradient(100deg, var(--accent-sky), var(--accent) 55%, var(--accent-deep));
2+
--accent: #3584e4;
3+
--accent-deep: #1c71d8;
4+
--accent-sky: #62a0ea;
5+
--grad-brand: var(--accent);
66

77
--font-display: 'Bricolage Grotesque', 'Instrument Sans', sans-serif;
88
--font-body: 'Instrument Sans', sans-serif;
99
--font-mono: 'JetBrains Mono', monospace;
1010

11-
--radius-lg: 22px;
11+
--radius-lg: 10px;
1212

13-
--bg: #060a12;
14-
--surface-1: rgba(24, 36, 65, 0.55);
15-
--surface-2: rgba(10, 17, 32, 0.85);
16-
--ink: #e8eefb;
17-
--ink-dim: #9fb0cc;
18-
--ink-faint: #66758f;
19-
--border-color: rgba(159, 176, 204, 0.16);
20-
--header-bg: rgba(6, 10, 18, 0.72);
21-
--ghost-bg: rgba(16, 26, 48, 0.5);
13+
--bg: #f6f5f4;
14+
--surface-1: #ffffff;
15+
--surface-2: #f0efed;
16+
--ink: #1d1d1f;
17+
--ink-dim: #55575c;
18+
--ink-faint: #8a8d92;
19+
--border-color: #deddda;
20+
--header-bg: rgba(246, 245, 244, 0.94);
21+
--ghost-bg: #ffffff;
2222
}
2323

24-
html[data-theme='light'] {
25-
--bg: #f3f7ff;
26-
--surface-1: rgba(255, 255, 255, 0.85);
27-
--surface-2: rgba(255, 255, 255, 0.95);
28-
--ink: #101e38;
29-
--ink-dim: #44587e;
30-
--ink-faint: #7787a3;
31-
--border-color: rgba(60, 130, 246, 0.2);
32-
--header-bg: rgba(243, 247, 255, 0.8);
33-
--ghost-bg: rgba(255, 255, 255, 0.6);
24+
html[data-theme='dark'] {
25+
--bg: #1e1e1e;
26+
--surface-1: #2a2a2a;
27+
--surface-2: #242424;
28+
--ink: #f4f4f4;
29+
--ink-dim: #c7c7c7;
30+
--ink-faint: #8f8f8f;
31+
--border-color: #3f3f3f;
32+
--header-bg: rgba(30, 30, 30, 0.94);
33+
--ghost-bg: #2a2a2a;
3434
}
3535

3636
* {
@@ -56,7 +56,7 @@ body {
5656
h1, h2, h3 {
5757
font-family: var(--font-display);
5858
line-height: 1.1;
59-
letter-spacing: -0.02em;
59+
letter-spacing: 0;
6060
margin: 0;
6161
text-wrap: balance;
6262
}
@@ -84,7 +84,7 @@ img {
8484
}
8585

8686
.card {
87-
background: linear-gradient(160deg, var(--surface-1), var(--surface-2));
87+
background: var(--surface-1);
8888
border: 1px solid var(--border-color);
8989
border-radius: var(--radius-lg);
9090
}

0 commit comments

Comments
 (0)