Sign in

RWX work

@rwx.work
2 followers 2 following 31 posts

Projects 🔗 tangled.org/rwx.work 🔗 forge.rwx.work/rwx.work #rwx Read Write eXecute #spcd Shell to Python CD #ilos Incremental Live OS #lsgm Live Scan Grub Menu #ofsp Operating FS Profile #srlp Software Repos Local Profile 🦋 @marc.beninca.link @tilde.link

PostsRepliesMedia
RWX work @rwx.work · 30/03/2026
After exploring goat cli for quite a while, dropped all account’s original rotation keys!
Git log segment showing the removal of all original rotation keys…

  "rotationKeys": [
    "did:key:zDnaew93xf5AwAjaxqby3fRtVufFAj6eNQcnqSH4MuPWySSBV"[-,-]
[-    "did:key:zQ3shhCGUqDKjStzuDxPkTxN6ujddP4RkEKJJouJGRRkaLGbg",-]
[-    "did:key:zQ3shpKnbdPx3g3CmPf5cRVTPe1HtSwVn5ish3wSnDPQCbLJK"-]
  ],
  "alsoKnownAs": [
    "at://rwx.work"
000
RWX work @rwx.work · 04/01/2026
Shell system aliases, set from annotations, here for #rsync functions to sync & delete. #rwx
File: rsync.sh

# rsync

# synchronize
#| rsync
#= rs
rwx_rsync() {
	rsync \
		--archive \
		--no-inc-recursive \
		--partial \
		--progress \
		--verbose \
		"${@}"
}

# synchronize and delete after
#= rsda
rwx_rsync_delete_after() {
	rwx_rsync \
		--delete-after \
		"${@}"
}

# synchronize and delete before
#= rsdb
rwx_rsync_delete_before() {
	rwx_rsync \
		--delete-before \
000
RWX work @rwx.work · 04/01/2026
The #awk proportion more than doubled. #rwx
750 commits, 2 branches
0 tags, 4.9 MiB
Shell 75.5%, Python 15.2%, Awk 9.3%
000
RWX work @rwx.work · 04/01/2026
2025-08-13 Ready to use #tmux configuration. #rwx
gnome-terminal window running tmux with title:
projects - rwx - rwx - 3: bash  |  114 × 25 - 3: 56 × 12

Window left pane: main / find
# path to the entrypoint main file of the project
rwx_main_path="${rwx_main_root}/${rwx_main_file}"
# FIXME sparate in two functions
# find root directory shell modules
#| find
#| sort
rwx_main_find() {
	local root="${1}"
	[ -d "${root}" ] &&
		find \
			"${root}" \
			-name "*.${RWX_MAIN_EXTENSION}" \
			-type "f" \
			-printf "%P\n" |
		sort
}

Window top right pane: posix shell modules…
core, crypt.sh, de, dev, ffmpeg.sh, fs, fs.sh, gpg.sh,
gui, id.sh, io, lint, list.sh, log, main.sh, os,
pm, ps, pw, rescue, self.sh, shell, tui, util.sh

Window bottom right pane: trailing project root files…
pyproject.toml, readme.md, render.py, rwx, sh, tmp

Bottom status bar with four lines
and square brackets [] for panes synchronized (blue), zoomed (red), both (magenta):
1) left: windows dn, profile, logo, prj, rwx, spcd, help, site, venv, ytlp; right: time 19:28:24
2) left: sessions beninca, ilos, marc, private, public, rwx, tilde; right: date 2025-08-13
3) left: servers projects, default; right: panes batcat, bash, bash
4) current directory /media/marc/data/ssd/mobile/data/w/projects/public/rwx.work/rwx
000
RWX work @rwx.work · 04/01/2026
2025-07-08 The #awk code base is growing… #rwx
359 commits, 4 branches
0 tags, 3.7 MiB
Shell 66.1%, Python 29.8%, Awk 4.1%
000
RWX work @rwx.work · 04/01/2026
2025-07-06 Learning #awk but, for now, mostly doing regex matching… #rwx
BEGIN {
	RE_ANY = "(.*)"
	RE_CONST = "([_A-Z][_0-9A-Z]*)"
	RE_SET = "=.*"
	RE_SPACE = "[[:space:]]"
	RE_SPACES = RE_SPACE "*"
	RE_VAR = "([_a-z][_0-9a-z]*)"

	RE_BEGIN = "^"
	RE_END = RE_SPACES "$"
	RE_FUNC = RE_SPACES "\\(" RE_SPACES "\\)" RE_SPACES "{"

	RE_ALIAS = RE_BEGIN "#=" RE_SPACES RE_VAR RE_END
	RE_CLOSE = RE_BEGIN "}" RE_SPACES RE_END
	RE_CONSTANT = RE_BEGIN RE_CONST RE_SET RE_END
	RE_DOC = RE_BEGIN RE_SPACES "#" RE_SPACE RE_ANY RE_END
	RE_FUNCTION = RE_BEGIN RE_VAR RE_FUNC RE_END
	RE_MODULE = RE_BEGIN "#." RE_SPACES RE_ANY RE_END
	RE_SHEBANG = RE_BEGIN "#!" RE_SPACES RE_ANY RE_END
	RE_VARIABLE = RE_BEGIN RE_VAR RE_SET RE_END
100
RWX work @rwx.work · 04/01/2026
2025-06-30 Further into #tmux configuration, with multiple servers, sessions, windows, panes… #rwx
gnome-terminal window running tmux with title:
p1 → rwx → rwx (5∕10) → bash (2∕3)

Window top left pane: python package files…
arg, cmd, deb, err, fs, grub, log, os, prj, ps, sw, txt, web

Window bottom left pane: posix shell modules…
alias, cryptsetup.sh, debian.sh, ffmpeg.sh, file.sh, fs.sh,
gnome.sh, gpg.sh, lint, live.sh, log, main.sh, python.sh,
rescue, self.sh, shell.sh, tmux.sh, util.sh

Window right pane: subsection of markdown readme file…
## 2 [How](#toc) {#how}
### 2.1 [Shell](#how) {#how-shell}
* [X] functions to
  * [X] alias
  * [X] lint
    * [X] Git
    * [X] Python
    * [X] Shell
  * [X] log
  * [X] rescue
    * [X] Hetzner
    * [X] OVH
* [X] profiles
  * [X] ffmpeg
  * [X] tmux
### 2.2 [Python](#how) {#how-python}

Bottom status bar with five lines:
1) left: windows dn, profile, logo, prj, rwx, spcd, help, site, venv, ytlp; right: time 02:33:32
2) left: sessions beninca, ilos, marc, private, public, rwx, tilde; right: date 2025-06-30
3) servers p1, p2 & directory /media/marc/data/ssd/mobile/data/w/projects/public/rwx.work/rwx
4) left: window panes process names bash, bash, batcat; right: hostname bookworm
5) left: window panes sizes & total 52×11, 52×12, 61×24 & 114×24; right: user user
000
RWX work @rwx.work · 04/01/2026
2025-06-17 A bit of #js & #css code to have two-ways interaction between the #html video & list of #vtt chapters. #rwx
JS:

const chapters = document.getElementById("chapters");
const video = document.getElementById("video");
const cues = [];

for (let track of video.textTracks) {
    if (track.kind === "chapters") {
        track.mode = "hidden";
        let id, text, tr;
        setTimeout(() => {
            for (let cue of track.cues) {
                id = document.createElement("td");
                text = document.createElement("td");
                tr = document.createElement("tr");
                id.textContent = cue.id;
                text.textContent = cue.text;
                tr.onclick = () => {
                    video.currentTime = cue.startTime;
                    video.play();
                };
                tr.appendChild(id);
                tr.appendChild(text);
                chapters.appendChild(tr);
                cues.push({ cue, tr });
            }
        }, 250);
        break;
    }
}

video.addEventListener("timeupdate", () => {
    const time = video.currentTime;
    for (const { cue, tr } of cues) {
        if (time >= cue.startTime && time < cue.endTime) {
            tr.classList.add("active");
        } else {
            tr.classList.remove("active");
        }
    }
});


CSS:

body {
background-color: #262626;
color: #ccc;
font-family: sans;
margin: auto;
}

.columns {
display: grid;
gap: 1em;
grid-template-columns: 1fr 3fr;
}
.list {
max-block-size: 100vh;
overflow: auto;
}

tr {
cursor: pointer;
}
tr.active {
color: #0f0;
}
tr:hover {
color: #f00;
}
tr:nth-of-type(even) {
background-color: #333;
}

video {
max-inline-size: 100%;
}
010
RWX work @rwx.work · 04/01/2026
2025-06-07 Silly looking regex heavy script written to list packages inside installation script. #ofsp
#! /usr/bin/env sh
FILE="$(readlink --canonicalize-existing "${0}")"
ROOT="$(dirname "${FILE}")"

main() {
	cat "${ROOT}/install.sh" |
		grep --perl-regexp "^\t\t(apt_install|\t\")" |
		grep --invert-match "\\\$" |
		sed "s|^\t\tapt_install \\\\||" |
		sed "s|^\t\t\t\"||" |
		sed "s|\" \"| |g" |
		sed "s|\" \\\\||" |
		sed "s|\"||"
}

main
000
RWX work @rwx.work · 03/01/2026
2025-05-17 Writing functions to screencast with #ffmpeg #rwx #vscodium
File: rwx > sh > ffmpeg.sh

rwx_ffmpeg_input_hdmi() {
	local device="${1}"
	[ -n "${device}"] || device="/dev/video0"
	set -- \
		-f "v4l2" \
		-video_size "1920x1080" \
		-framerate "120" \
		-input_format "yuv420p" \
		-i "${device}"
	local argument
	for argument in "${@}"; do echo "${argument}"; done
}

rwx_ffmpeg_output_audio_fast() {
	set -- \
		-codec:a "flac" \
		-compression_level "0"
	local argument
	for argument in "${@}"; do echo "${argument}"; done
}
000
RWX work @rwx.work · 03/01/2026
2025-05-16 First system aliases a__ prefix approach, here with #rsync functions to sync & delete. #rwx
File: rsync.sh

# synchronize
rs() { a__r_sync "${@}"; }
a__r_sync() {
	rsync \
		--archive \
		--no-inc-recursive \
		--partial \
		--progress \
		--verbose \
		"${@}"
}

# synchronize and delete after
rsda() { a__r_sync_delete_after "${@}"; }
a__r_sync_delete_after() {
	a__r_sync \
		--delete-after \
		"${@}"
}

# synchronize and delete before
rsdb() { a__r_sync_delete_before "${@}"; }
a__r_sync_delete_before() {
	a__r_sync \
		--delete-before \
		"${@}"
}
000
RWX work @rwx.work · 03/01/2026
2025-01-18 After a long time using #byobu, writing #tmux config from scratch… #rwx
gnome-terminal window running tmux with title: bash @ /home/user

Top status bar with three lines:
1) left: windows 0, 1 nano, 2 bash, 3 sleep; right: time 2025-01-18 18:09:32
2) center: window panes 1[57x26], 2[56x13], 3[56x12]
3) left: current directory /home/user ; right: current pane 56×13 2∕3

Current window with three panes: 1 left, 2 top right, 3 bottom right.

In left pane can be seen imported system & user modules:
40 lint/shfmt
41 live
42 log/log
43 log/step
44 rescue/common
45 rescue/hetzner
46 rescue/ovh
47 self
48 shell
49 tmux
50 util
. /home/user/rwx
01 cryptsetup
02 fix
03 newsboat
04 self
05 srv

In all three panes can be seen rwx shell commands prefixes:
rwx_… = functions
 a__… = aliases
 u__… = user
000
RWX work @rwx.work · 03/01/2026
2024-12-13 RWX work: 2023 → 2024 I’ve been writing code in #python & shells ( #bash , #grub , #posix ): #lsgm Live Scan Grub Menu #rwx Read Write eXecute #spcd Shell to Python Continuous Deployment #srmp Software Repositories Mirror Profile #ffmpeg #git #gource
000
RWX work @rwx.work · 20/12/2025
2024-11-26 First functions naming approach: – prefix a__ for system Aliases – prefix sh_ for regular functions – prefix u__ for User aliases #rwx
bash completion for prefixes.


a__apt_cache_list
a__apt_cache_policy
a__apt_cache_search
a__apt_get_auto_purge
a__apt_get_auto_remove
a__apt_get_clean
a__apt_get_full_upgrade
a__apt_get_install
a__apt_get_purge
a__apt_get_remove
a__apt_get_up_date
a__apt_get_up_grade
a__bat
a__btrfs_filesystem_d_f
a__btrfs_filesystem_d_u
a__btrfs_filesystem_usage
a__btrfs_property_get
a__btrfs_subvolume_create
a__btrfs_subvolume_delete
a__btrfs_subvolume_list
a__btrfs_subvolume_snapshot
a__btrfs_subvolume_snapshot_r
a__byo_bu
a__byo_bu_attach
a__byo_bu_ls
a__byo_bu_new_detach
a__change_mode_directory
a__change_mode_file

a__change_owner_root
a__change_owner_user
a__clear
a__co_py_interactive
a__e_macs
a__e_vince
a__git_add
a__git_add_all
a__git_add_all_patch
a__git_add_patch
a__git_branch
a__git_branch_delete
a__git_branch_delete_force
a__git_branch_list
a__git_branch_set_upstream
a__git_checkout
a__git_checkout_orphan
a__git_cherry_pick
a__git_cherry_pick_abort
a__git_cherry_pick_continue
a__git_clean_force
a__git_commit_amend_message
a__git_commit_empty_message
a__git_commit_message
a__git_config_user_email
a__git_config_user_name
a__git_diff
a__git_diff_cached

a__git_diff_cached_word
a__git_diff_tool
a__git_diff_word
a__git_fetch
a__git_fetch_prune
a__git_garbage_collect
a__git_init
a__git_init_bare
a__git_log
a__git_log_all
a__git_log_all_patch
a__git_log_patch
a__git_merge
a__git_merge_abort
a__git_merge_commit
a__git_merge_squash
a__git_merge_tool
a__git_push
a__git_push_delete
a__git_push_force
a__git_re_base
a__git_re_base_abort
a__git_re_base_continue
a__git_re_base_force
a__git_re_base_interactive
a__git_re_mote_add
a__git_re_mote_list
a__git_re_mote_set_upstream

a__git_re_mote_show
a__git_re_move
a__git_re_set
a__git_re_set_hard
a__git_show_commit
a__git_status
a__git_tag
a__git_tag_delete
a__gpg_agent_kill
a__gpg_agent_update
a__grep
a__kill
a__kill_all
a__kill_all_force
a__kill_force
a__list_block
a__list_block_no_empty
a__list_block_output
a__ls
a__ls_time

…
000
RWX work @rwx.work · 20/12/2025
2024-10-22 47 GB of memory usage, after building a #debian live operating system in ram, while multi-tasking on gnome desktop. #ofsp
gnome system monitor displaying graphs of:

CPU: 12 units at 100.0% usage
Memory: 47.0 GB (70.0%) of 67.1 GB
000
RWX work @rwx.work · 20/12/2025
2024-10-20 Sorting operating systems by main workflow duration. #spcd
main workflow steps:

spcd
spcd-check-project
spcd-build-project
spcd-browse-workspace

main workflow durations:

alpine in 45s
debian in 1m15s
ubuntu in 1m26s
arch in 1m34s
opensuse in 1m44s
fedora in 3m29s
alma in 3m33s
rocky in 4m18s

page footer:
Powered by Forgejo Version: 8.0.3+gitea-1.22.0 Page: 23ms Template: 2ms
000
RWX work @rwx.work · 20/12/2025
2024-10-15 Trying custom #python actions in #forgejo … #spcd
Workflow steps ending with custom python action failure:

spcd
spcd-check-project
spcd-build-project
spcd-browse-workspace
./act/synchronize
000
RWX work @rwx.work · 20/12/2025
2024-09-06 Realizing that #musl is really quite different. #posix #rwx #spcd
Comparing locale behaviors
of debian glibc & alpine musl.

Both have:
LANG
LC_CTYPE
LC_NUMERIC
LC_TIME
LC_COLLATE
LC_MONETARY
LC_MESSAGES
LC_ALL

musl has no:
LC_PAPER
LC_NAME
LC_ADDRESS
LC_TELEPHONE
LC_MEASUREMENT
LC_IDENTIFICATION

Then comparing LC_MONETARY for both.

musl has only: crncystr

glibc has:
int_curr_symbol
currency_symbol
mon_decimal_point
mon_thousands_sep
mon_grouping
000
RWX work @rwx.work · 20/12/2025
2024-08-30 Workflows main & alt, for latest & previous versions of supported operating systems. #spcd
Side-by-side main branch workflows executions.

Left: main.yaml
arch success in 2m33s
alpine success in 2m18s
fedora success in 7m35s
debian failure at 5m22s
opensuse success in 2m44s
ubuntu success in 10m2s
alma success in 8m45s
rocky success in 10m13s

Right: alt.yaml
arch success in 2m48s
alpine success in 1m39s
fedora success in 11m24s
opensuse success in 3m9s
alma success in 11m33s
rocky success in 11m8s
ubuntu success in 6m33s
debian failure at 3m53s
000
RWX work @rwx.work · 20/12/2025
2024-08-27 Fancy steps & substeps banners for project workflows logging. #posix #spcd
Left pane with operating systems to build into.

Done:
alpine in 1m54s
archlinux in 2m19s
opensuse in 2m55s
fedora in 9m6s
ubuntu in 8m27s
almalinux in 8m43s

Running: rockylinux at 9m36s

Right pane with log, displaying steps & substeps
as rounded box drawing characters framed banners:

6.3.3 | Python | Virtual environment | Create
6.3.4 | Python | Virtual environment | Activate
6.4 | Python | Modules
6.4.1 | Python | Modules | List
6.4.2 | Python | Modules | Main
6.4.3 | Python | Modules | Check
000
RWX work @rwx.work · 20/12/2025
2024-07-22 Don’t you ever say that I’m a debian monomaniac… #spcd
A list of builds on various os docker images.

Success:
almalinux 9
alpine 3.20
archlinux base 20240101
fedora 40
rockylinux 9
ubuntu noble

Failure:
debian bookworm
000
RWX work @rwx.work · 20/12/2025
2024-07-13 Starting with versions ≥ 0.5.x, #ruff is relentlessly shaming me in a multi-line contextual fashion, instead of short messages by default! #python #spcd
Quick showcase of ruff default errors formatting.

Old style:
spcd/util.py:40:5: D103 Missing docstring in public function

New style:
spcd/util.py:40:5: D103 Missing docstring in public function
   |
40 | def step(text: str) -> None:
   |     ^^^^ D103
41 |     env.SPCD_STEP += 1
42 |     log.info(env.SPCD_DOWN)
   |
000
RWX work @rwx.work · 20/12/2025
2024-03-24 Finally setting up a personal software forge: – #forgejo instead of github | gitlab | gitea – forgejo-runner instances using #docker – custom #bash actions for workflows #rwx #spcd
Two browser windows displaying parallel executions,
for both a project’s main and dev git branches,
of ci/cd workflows with custom bash actions:

cd-bootstrap
cd-list-environment
cd-clone-branch
cd-install-packages 'pandoc'
cd-build-project
cd-browse-workspace
cd-synchronize 'out'
020
RWX work @rwx.work · 20/12/2025
2023-08-23 Tinkering with prompt render… #rwx
Showcasing box drawing characters and prompt colors,
changing along user switching and error codes raising:

users: green for regular ones and red for root
return codes: green for ok and red for errors
000
RWX work @rwx.work · 20/12/2025
2023-07-27 Debian: from local mirror to live-boot squashfs #4 debootstrap base fs in ram configure basics & defaults install tui packages archive fs as tui squashfs install gui packages archive fs as gui squashfs ram peak usage: 29.2 GB display errors & useless list tui & gui files #ofsp
000
RWX work @rwx.work · 19/12/2025
2023-07-20 Debian: from local mirror to live-boot squashfs #3 debootstrap base fs configure basics & defaults upgrade initial file system install tui packages archive fs as tui squashfs install gui packages archive fs as gui squashfs display errors & useless list tui & gui files & sizes #ofsp
000
RWX work @rwx.work · 19/12/2025
2023-06-20 Debian: from local mirror to live-boot squashfs #2 debootstrap base fs configure basics & defaults mount special files & local mirror upgrade initial file system set users & passwords install tui & gui packages display errors & useless transfer bash profile archive final fs #ofsp
000
RWX work @rwx.work · 19/12/2025
2023-06-13 Debian: from local mirror to live-boot squashfs #1 debootstrap base fs configure apt set defaults & basics mount special files & local mirror upgrade initial file system install software packages set users & passwords unmount mirror & files transfer bash profile archive final fs #ofsp
000
RWX work @rwx.work · 19/12/2025
2023-05-04 GRUB: from ESP to VM create & connect storage images partition both virtual devices zeroize, format & transfer files create raid0, cryptsetup & lvm display partition tables launch vm with storage open encrypted device close virtual machine scroll complete log #lsgm
000
RWX work @rwx.work · 08/12/2025
2023-01-04 Starting to #kexec reboot on my main server with a tiny script… #ofsp
cat /usr/local/bin/kreboot

↓

#! /usr/bin/env bash

ROOT='/media/boot/latest'

function main {
	kexec \
	--initrd "${ROOT}/initrd.img" \
	--load "${ROOT}/vmlinuz" \
	--reuse-cmdline \
	&& reboot
}

main
000
RWX work @rwx.work · 08/12/2025
2022-02-02 Figuring out useful #uefi & #bios modules for custom #grub standalone binary images… #lsgm
regexp
memdisk tar
search
part_gpt part_msdos
lvm mdraid1x
btrfs ext2 iso9660 udf
exfat fat hfs hfspluscomp ntfscomp
linux loopback squash4
#
at_keyboard keylayouts keystatus read
halt reboot
all_video videoinfo gfxterm_background jpeg png tga
#
date echo eval help sleep test true
cpuid lspci videoinfo
cat configfile hashsum loadenv progress testspeed
gcry_sha256 gcry_sha512
pgp
)
GRUB_IMAGE_BIOS_MODULES=(
biosdisk
010