Skip to content

Commit bddfe48

Browse files
ten9876claude
andcommitted
Blog: v26.8.1 — the settings store, and the escape hatch
Spine is the move from an XML settings file to a SQLite store, and the reason it comes with `aethersdr --config`: a stored value can be bad enough to stop the app launching, so a settings editor that lives inside the GUI is unavailable exactly when it is needed. A recovery mechanism that depends on the thing it recovers only works when you don't need it. That generalises past this release, which is what earns it the lede. Also covered: why a full-file rewrite made the blast radius of changing one checkbox the entire configuration; credentials moving to the OS keychain, and why a settings file is a sociable object that ends up in bug reports and forum posts; the TCI slice-routing fixes, including the cached route that could put RF out of a stale slice's antenna; and the metering staleness, where the ACOM gauge reading 206 W for 120 W matters because reflected power is the number you use to decide whether to stop transmitting. The three upgrade-blocking changes lead, ahead of any of it — Intel Macs losing Copy Assist (one optional feature was setting the bundle's macOS floor), aarch64 needing Trixie, and Qt 6.8 for source builds. Notes the v26.7.4.1 hotfix in passing, since it was never written up here and anyone still on v26.7.4 should move regardless. New "store" motif for the art — stacked platters with the key set apart, for the credentials that no longer live among them. Card, article, art and reading time verified rendered in a browser; the generated post index, blog.md and token counts picked the post up without touching the generator. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent 589f14c commit bddfe48

8 files changed

Lines changed: 399 additions & 5 deletions

File tree

api/v1/posts.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"site": "https://www.aethersdr.com/blog",
3-
"count": 13,
3+
"count": 14,
44
"note": "Posts are routed client-side; the canonical URL of a post is the blog page plus its slug fragment.",
55
"posts": [
66
{
@@ -13,6 +13,16 @@
1313
"image": "https://www.aethersdr.com/assets/img/first-contribution-card.svg",
1414
"pinned": true
1515
},
16+
{
17+
"slug": "release-26-8-1",
18+
"title": "v26.8.1: settings that survive, and a way in when they don’t",
19+
"url": "https://www.aethersdr.com/blog#release-26-8-1",
20+
"published": "2026-08-02",
21+
"summary": "Your settings stop being an XML file and become a database — transactional saves, verified backups, and credentials moved out to your OS keychain. Then the part that matters when it goes wrong: a config editor that runs without the GUI, because the escape hatch can’t depend on the thing it’s rescuing.",
22+
"readingTime": "10 min read",
23+
"image": "https://www.aethersdr.com/assets/img/release-26-8-1-card.svg",
24+
"pinned": false
25+
},
1626
{
1727
"slug": "release-26-7-4",
1828
"title": "v26.7.4: Copy Assist, and the eight milliseconds that ate half the audio",

api/v1/site.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,5 +58,5 @@
5858
"signatures": "Every release ships .asc signatures and SHA256SUMS.txt."
5959
},
6060
"latestReleaseMentionedOnSite": "v26.7.1",
61-
"postCount": 13
61+
"postCount": 14
6262
}

assets/img/release-26-8-1-card.svg

Lines changed: 48 additions & 0 deletions
Loading

assets/img/release-26-8-1-hero.svg

Lines changed: 48 additions & 0 deletions
Loading

blog.html

Lines changed: 157 additions & 0 deletions
Large diffs are not rendered by default.

blog.md

Lines changed: 121 additions & 1 deletion
Large diffs are not rendered by default.

functions/md-map.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
export const MD_MAP = {
44
'/': { asset: '/index.md', tokens: 3065 },
55
'/index.md': { asset: '/index.md', tokens: 3065 },
6-
'/blog': { asset: '/blog.md', tokens: 14362 },
7-
'/blog.md': { asset: '/blog.md', tokens: 14362 },
6+
'/blog': { asset: '/blog.md', tokens: 17534 },
7+
'/blog.md': { asset: '/blog.md', tokens: 17534 },
88
'/lineage': { asset: '/lineage.md', tokens: 1994 },
99
'/lineage.md': { asset: '/lineage.md', tokens: 1994 },
1010
};

scripts/gen-blog-art.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,16 @@ def build_card(path):
301301
'<rect x="38" y="-11" width="48" height="7" rx="3.5" fill="currentColor" opacity=".85"/>'
302302
'<rect x="38" y="8" width="58" height="7" rx="3.5" fill="currentColor" opacity=".4"/>'
303303
'<rect x="38" y="27" width="30" height="7" rx="3.5" fill="currentColor" opacity=".2"/>',
304+
# Stacked platters, and the key that no longer lives among them.
305+
"store": "".join(
306+
f'<ellipse cy="{cy}" rx="60" ry="16" fill="none" stroke="currentColor" '
307+
f'stroke-width="2.8" opacity="{op}"/>'
308+
f'<path d="M-60 {cy}v24a60 16 0 0 0 120 0v-24" fill="none" stroke="currentColor" '
309+
f'stroke-width="2.8" opacity="{op}"/>'
310+
for cy, op in ((-62, ".42"), (-10, ".68"), (42, "1")))
311+
+ '<circle cx="92" cy="-56" r="14" fill="none" stroke="currentColor" stroke-width="3"/>'
312+
'<path d="M92-42v40m0-24h11m-11 12h8" fill="none" stroke="currentColor" '
313+
'stroke-width="3" stroke-linecap="round"/>',
304314
# Cross-needle: the reading is where they intersect.
305315
"meter": '<path d="M-86 34a92 92 0 0 1 172 0" fill="none" stroke="currentColor" '
306316
'stroke-width="2.4" opacity=".45"/>'
@@ -363,6 +373,7 @@ def build_release(root, slug, version, kicker, motif, force=False):
363373

364374

365375
RELEASES = [
376+
("release-26-8-1", "v26.8.1", "Settings that survive", "store"),
366377
("release-26-7-4", "v26.7.4", "Speech to text", "copyassist"),
367378
("release-26-7-3", "v26.7.3", "Meters you can trust", "meter"),
368379
("release-26-7-2", "v26.7.2", "Digital voice", "dstar"),

0 commit comments

Comments
 (0)