608 private links
Loopia has served me well for years. But they raise their prices at a cadence that is obscenely high. Alternatives?
- https://www.gandi.net - even more expensive than Loopia for
.sedomains. - https://porkbun.com - doesn't sell
.sedomains apparently. - https://zone.ee - based in Estonia. Practically the same prices as Loopia.
- https://se.godaddy.com/domains - even more expensive than Loopia for
.sedomains. - https://www.one.com - the first registrar I used, maybe good for beginners but nothing else.
- https://hostup.se/doman - baserad i Sverige.
- https://www.strato.se - baserad i Tyskland. 90 SEK/år för
.sevid första åsyn låter ju lovande. What? Only 5 subdomains? They're trying to limit the number of subdomains I can create? What's this nonsense. Enshittification everywhere.
I recently reworked my LaTeX template underlying my CV to be compliant with PDF/A-3U, and now I keep noticing chatter about PDF/A compliance or PDF accessibility in my feeds.
Let's collect notes here.
Accessibility of STEM documents
- https://tex.social/accessibility-of-stem-documents-talk-at-pdf-days-2025-in-berlin - blog post
- https://pdfa.org/the-winning-technical-poster-at-pdf-days-europe-2025 - all posters from the PDF Days Europe 2025 conference (many of them are about accessibility), very interesting!
- https://pdfa.org/presentation/tagged-and-accessible-pdf-with-latex-revisited - session at the same conference on "tagged and accessible PDF with LaTeX" with references to several works by the core LaTeX developers.
TinyTinyRSS has been my primary way of following and reading feeds for over a decade.
The original developer retired the project om 2025-11-01, but one the main contributors created a fork to pick up the mantle. Via https://fosstodon.org/@wallabag/115329272917315994 and https://pierce.xyz/@eric/115330726572632285.
TinyTinyRSS server
- https://github.com/tt-rss/tt-rss (main project since Nov 2025)
- https://github.com/HenryQW/Awesome-TTRSS - as far as I can tell this is an unofficial Dockerfile and Docker compose for TTRSS. I have not checked whether it still points to the retired repos or to the new fork.
Plugins
- https://github.com/joshp23/ttrss-to-wallabag-v2 - last commit 2021-03-14, repo archived on 2025-05-19
- https://github.com/Nikkiiw/ttrss-to-wallabag-v2-fix - last commit 2022-04-18, fork from joshp23's repo
- https://github.com/GregThib/ttrss-shaarli
- https://github.com/tt-rss/tt-rss-plugin-googlereaderkeys
- https://github.com/resticDOG/tt-rss-plugin-ntfy - huh, cool.
- https://github.com/lotrfan/ttrss_import_export_all - import/export all articles. But last commit 12 years ago, so I wouldn't expect it to work.
- https://github.com/cas--/tt-rss-plugin-hide_unread_count - another 12-years old repo.
Android
- https://github.com/tt-rss/tt-rss-android - does not have any releases yet, so we cannot use Obtainium to install it on Android.
- https://github.com/fbarthelery/geekttrss - an alternative TTRSS reader app. Also on F-Droid.
iOS
- https://apps.apple.com/us/app/tiny-reader-rss/id689519762 - I know nothing about it.
Other clients
- https://github.com/martinrotter/rssguard - runs on Windows, Linux, BSD, OS/2, and macOS.
- https://github.com/aooiuu/vscode-ttrss - crazy, TTRSS in VSCode. I don't even know what to say.
What others say about TinyTinyRSS
- https://www.extrema.is/blog/2021/11/10/rss-part-10-tiny-tiny-rss - this is part of a whole series of posts about different RSS readers.
- https://old.reddit.com/r/selfhosted/comments/kar97w/selfhosted_rss_with_entire_articles
A simpler alternative to Nextcloud and ownCloud, built with TypeScript and Deno.
First I hear of it. Seems to be developed primarily by a single developer.
I have not tested it.
- https://news.ycombinator.com/item?id=39726172
- https://en.cozy.io - this is another project: Cozy (or Twake as it appears to be called) is clearly not FOSS.
This turned out to be very simple.
In addition to Signal on my phone, and the Signal Desktop app on my computer, I can now have Molly on my tablet. Not crucial for receiving messages, but very useful for sharing links/messages while browsing on the tablet.
- Add Molly's repo to F-Droid (url: https://molly.im/fdroid/foss/fdroid/repo).
- Install Molly.
- Select "Link existing device" in Molly and then use Signal's Link Device function from the phone.
This tablet lacks any Google services, and in the absence of a dedicated MollySocket (which I have not bothered to setup, maybe if I decide to use Molly instead of the Signal client on my phone) the app uses WebSocket which is power-consuming but that does not bother me on the tablet.
- Enable Wireless debugging in Developer options.
- Click on Pair device with pairing code.
- On the computer,
adb pairfollowed by the IP address and port number as shown on the device, for exampleadb pair 192.168.1.322:49014. This will immediate challenge you to provide the six-digit pairing code shown on the device. - Now invoke
scrcpy --tcpip=192.168.1.322:49014(or you could just as well use its serial number as shown byadb devicesinstead,scrcpy -s adb-HJBF6XUO-jtwWkn._adb-tls-connect._tcp
Thanks to rofi launcher and its great rofi-code addition I can quickly open a list of VSCodium's recent workspaces and launch one.
The down-side is that the list of workspaces can get stale over time, including no longer existing workspaces or intra-workspace directories opened once by mistake, etc.
Here's how I usually go about to clean up the list of saved workspaces.
The first hurdle is to descend into each subdirectory inside ~/.config/VSCodium/User/workspaceStorage/ (usually named with a long non-descript hex string) and extract the path of the workspace or folder from its workspace.json:
user@host:~
$ cd ~/.config/VSCodium/User/workspaceStorage && vsws_dirname=$(find . -type f -name "workspace.json" -exec dirname {} \;) && \
vsws_content=$(find . -type f -name "workspace.json" -exec awk 'NR==2{print}' {} \;) && \
paste <( printf "%s" "$vsws_dirname" ) <( printf "%s" "$vsws_content" )
There is some repetition, but it's the best I could manage. Was not able to figure out how to get the output of dirname and awk into two columns on the same row using a single find statement.
shell can pipe concatenated commands, could that help simplify our syntax above? https://michal.sapka.pl/2025/shell-piping-concatenated-commands
This gets the path (limited to only the dirname to save space) and the second row of its workspace.json file on the same row.
Example output:
./16fb4bf8cd57e227024b6ded7c39bdb6 "workspace": "file:///chepec/thesis"
./efa86aa09236afc7bd72a99fc93b10e5 "folder": "file:///projects/ansible/roles/dev/remote"
./4bb9a895f505160553890e3f73739cb1 "folder": "file:///backup/luxor/ansible/playbooks/luxor"
./9084209236dc2c220c3759a756343ac4 "folder": "file:///projects/ansible"
We can grep to filter the output to only contain the Codium workspaces/folder that we want to prune, and then delete those folders in one go:
$ cd ~/.config/VSCodium/User/workspaceStorage && \
vsws_dirname=$(find . -type f -name "workspace.json" -exec dirname {} \;) && \
vsws_content=$(find . -type f -name "workspace.json" -exec awk 'NR==2{print}' {} \;) && \
paste <( printf "%s" "$vsws_dirname" ) <( printf "%s" "$vsws_content" ) | \
grep "projects/ansible" | awk '{print $1}' | xargs rm -r --
Verbose, but works nicely.
Authored by Matthias Bannert, published 2024-09-16.
The online version of this book is free to read and licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
- https://github.com/rse-book/rse-book.github.io - Markdown source code and issues
Number of commits in a git repo can be used as a quick-and-dirty estimation of amount of development time spent in a repo. For variations on this theme, see my previous linkpost.
Here's the bash one-liner I wrote and a few lines of its output:
taha@luxor:~
$ THISPATH="/media/bay/taha/projects/ansible/pub/roles"; find "$THISPATH" -maxdepth 2 -iname ".git" -type d -exec bash -c \
"git -C {} rev-list --count --all | tr '\n' '\t'; echo -e ' ${BGreen}${On_Black}{}${Color_Off}' | \
sed 's+/.git++' | sed 's+$THISPATH/++'" \; | sort -n --reverse -
91 dotfiles
42 R
39 lxd-server
36 python3
36 i3wm
Explainer
- We will look for git repos inside the
/media/bay/taha/projects/ansible/pub/rolesdirectory, and since this path needs to be referenced twice more in the command we can DRY by defining a local var$THISPATH. - some roles may contain git submodules, so to avoid including them here we limit depth to only include the top-level
.gitdirectory (which is 2 levels down from the search path). - get the number of commits (across all branches and authors) for each repo.
trreplaces the trailing newline (introduced by output fromgit -C ...) with a tab so that number and repo name (which we print next) show on the same line.echo -e ' {}'the name of the current repo. I added some colouring for flourish.- to save on repitition in the output replace full path returned by
findby stripping the trailing.gitpart as well as the dirname part. Note that this is just my cosmetic preference. - sort by numeric value
-nand list in--reverseorder. Note the trailing dash which references the output from before the pipe.
Links
include_tasks files that in turn contain import_tasks cause cryptic errors
It appears to be good practice to avoid using import_tasks in a file if the file itself was included with include_tasks.
Because if you don't, expect to get cryptic error messages like:
# ERROR! Unexpected Exception, this is probably a bug: expected str, bytes or os.PathLike object, not NoneTypeI got an instance up and running (obligatory Ansible role https://codeberg.org/ansible/audiobookshelf) and added my audiobooks library to it. Looks very nice :-)
My initial impression is that the audiobooks UX is much better than that of Jellyfin. I will definitely be moving that library to Audiobookshelf.
Podcasts can only be added and episodes downloaded for users with admin privileges, which is a known short-coming with several open issues:
- https://github.com/advplyr/audiobookshelf/issues/1258
- https://github.com/advplyr/audiobookshelf/issues/507
- https://github.com/advplyr/audiobookshelf-app/issues/225
- https://github.com/advplyr/audiobookshelf/issues/4124 - duplicate of 1258
- https://github.com/advplyr/audiobookshelf/pull/3933 - PR submitted by mistake (Copilot)
But the UX in the web client is straight-forward as soon as you figure out how to switch between your "libraries" (most commonly "podcasts" and "audiobooks") using the not-so-prominent button just left of the search bar.
Audiobookshelf supports OPML import, and handled my OPML file with almost 150 feeds without choking.
In summary, I am happy to have it up and running and expect it to be my primary venue for audiobook and podcast listening.
- https://www.audiobookshelf.org - links to the project's own Android and iOS app
- https://plappa.me - another iOS app that works with Audiobookshelf or Jellyfin
- https://arstechnica.com/gadgets/2025/03/i-threw-away-audibles-app-and-now-i-self-host-my-audiobooks - good intro by Ars
- https://getrssfeed.com - extract RSS feed from Apple, Spotify, Deezer, Soundcloud links
- https://www.labnol.org/podcast - give it an Apple Podcast URL and it returns the RSS feed (web form)
- https://fetchrss.com/generator/init - self-blocked behind captcha
Soundcloud
Is the podcast you want to listen to hosted on Soundcloud? First of all, double-check that the podcast is not also hosted somewhere else (more often than not that is the case, and then you can simply avoid Soundcloud).
Soundcloud makes it really hard to discover the podcast's RSS feed. It is not shown anywhere on the page, nor in the HTML source.
Based on a feed URL we already possess and that channel's Soundcloud landing page, we can manually construct the hidden RSS feed endpoint for any Soundcloud "podcast":
- Open the HTML source of the Soundcloud "podcast", for example https://soundcloud.com/user-268302561.
- In the HTML source, find the
user IDproperty, which looks likesoundcloud://users:819898639(I suggest grep forsoundcloud://users). - Copy the numeric part, and construct a URL like this: https://feeds.soundcloud.com/users/soundcloud:users:819898639/sounds.rss.
- Take a moment to reflect on the awfulness of siloed web services and do your best to avoid encouraging them in future.
But I don't understand how to replace Mozilla Locations Services in MicroG with this. I suppose the microg project needs to make that decision, or perhaps I should update microg on the phone (not really possible without re-flashing the whole thing, I assume).
I have a Quarto project of manuscript type with notebooks that generate tables and figures. And I would like to include specific tables from any notebook in the main manuscript index.qmd.
In tackling this question I was constrained by the following factor:
- never
{{< include ... >}}a notebook into the main manuscript, because I found no way to do that without polluting the main manuscript with the entire contents of said notebook. This was unacceptable to me since the whole point of separating analysis into separate files was to keep the main manuscript "clean" and easy to work with for some co-authors who might not need or want to see all the plumbing.
A figure from a notebook is easily included in the main manuscript with {{< embed /notebooks/notebook.qmd#fig-id >}} which renders the plot, its caption and (assuming you defined a label) also numbers it and makes it cross-referable. Unfortunately no such mechanism is offered for tables (I assume because tables are not stand-alone image files that can easily be embedded).
Here is the hack of a solution that I arrived at after wrestling with this today. As far as I know I have not seen this particular approach mentioned anywhere else before.
In the notebook
Create a Markdown table using knitr::kable and save the output (i.e., the rendered Markdown table) to a file on disk, for example:
sas.fityk.params %>%
select(temperature, diameter, starts_with("fit.")) %>%
knitr::kable(col.names = c("$d/\\unit{\\nm}$", "$T_\\text{a}/\\unit{\\degreeCelsius}$",
"SSR", "WSSR", "DoF", "WSSR/DoF", "$R^2$"), digits = c(0, 1, 1, 2, 1, 1, 1, 6),
align = c("l", "l", "l", "l", "l", "l", "l", "l")) %T>%
print() %>%
saveRDS(file = here("assets/objects/tab-sas-fitinfo.rds"))
Note that print is necessary if you want to also render the table in the notebook's output.
And since the Markdown will be handled by pandoc we can also use LaTeX math. But another effect of this being Markdown is that the Quarto -> MathJax pipeline is never involved, so more complex LaTeX cannot be used. I wonder if there's a way to force Quarto to handle a particular chunk even if it would normally just be passed on to pandoc...?
In the main manuscript
```{r}
#| results: asis
this.cap <- paste("Goodness of fit parameters for the anti-Stokes/Stokes spectra.")
this.lbl <- "{#tbl-sas-fitinfo}"
cat(c(
readRDS(file = here("assets/objects/tab-sas-fitinfo.rds")),
paste(paste0("\n", ":"), this.cap, this.lbl, "\n")),
sep = "\n")
```
This re-produces the same table as in the notebook, and with a numbered table caption that can be cross-referenced. This works in rendered HTML output and even works in PDF (by some magic). I don't care too much about DOCX right now, so that's success!
Avenues that did not work
My first idea was to simply print the Markdown table in a chunk with a tbl-cap:
```{r}
#| results: asis
#| tbl-cap: Goodness of fit parameters for the anti-Stokes/Stokes spectra.
# label: tbl-sas-fitinfo
readRDS(file = here("assets/objects/tab-sas-fitinfo.rds"))
```
but this simply results in a Quarto error (apparently triggered by the presence of label):
Error running filter /usr/lib/rstudio-server/bin/quarto/share/filters/main.lua:
Block, list of Blocks, or compatible element expected, got table
That prompted me to try printing the caption line manually, but that too fails, surprisingly:
```{r}
#| results: asis
this.cap <- paste("Goodness of fit parameters for the anti-Stokes/Stokes spectra.")
this.lbl <- "{#tbl-sas-fitinfo}"
cat(paste(paste0("\n", ":"), this.cap, this.lbl, "\n"))
readRDS(file = here("assets/objects/tab-sas-fitinfo.rds"))
```
Turns out that in the intermediate Markdown file created by Quarto, every line in the chunk is printed inside its own fenced block, and thus the caption line becomes syntactically separate from the table itself.
The solution (as shown above) is to print the caption line and the table itself in a single command.
Links
- https://github.com/quarto-dev/quarto-cli/discussions/2052 - How to gracefully mix Markdown and latex tables?
- https://github.com/quarto-dev/quarto-cli/discussions/11067 - How to include pre-rendered tables?
- https://forum.posit.co/t/tables-numbering-in-quarto/196413 - tables numbering in quarto
- https://github.com/quarto-dev/quarto-cli/discussions/9334 - debugging advice for main.lua errors
- https://stackoverflow.com/questions/74097579/make-figure-text-bold-in-quarto-figure-captions - Make "Figure" text bold in quarto figure captions
- https://scholar.social/@solarchemist/114678486113073128
sessionInfo
$ quarto check # slightly cleaned-up output
Quarto 1.5.57
[✓] Checking versions of quarto binary dependencies...
Pandoc version 3.2.0: OK
Dart Sass version 1.70.0: OK
Deno version 1.41.0: OK
Typst version 0.11.0: OK
[✓] Checking versions of quarto dependencies......OK
[✓] Checking Quarto installation......OK
Version: 1.5.57
Path: /usr/lib/rstudio-server/bin/quarto/bin
[✓] Checking tools....................OK
TinyTeX: (not installed)
Chromium: (not installed)
[✓] Checking LaTeX....................OK
Using: Installation From Path
Path: /usr/local/texlive/2023/bin/x86_64-linux
Version: 2023
[✓] Checking basic markdown render....OK
[✓] Checking Python 3 installation....OK
Version: 3.10.12
Path: /usr/bin/python3
Jupyter: (None)
[✓] Checking R installation...........OK
Version: 4.5.0
Path: /opt/R/4.5.0/lib/R
knitr: 1.50
rmarkdown: 2.29
[✓] Checking Knitr engine render......OKReduction-oxidation sum reactions are typically written as two lines (red/ox) with a sum reaction underneath. Here is an example of how to typeset this building on the reactions environment from the awesome chemmacros package.
My goals with this custom environment was to retain chemical reaction numbering (with sub-numbering for the redox reactions) and horizontally align everything on the reaction arrow.
The solution is not automated all the way so may require some fiddling of horizontal or vertical distances to make it look great.
Load chemmacros in the preamble:
\usepackage[
% *minimal* specifies the following set of always loaded modules:
% acid-base, charges, nomenclature, particles, phases, symbols
minimal=true,%
modules={reactions}%
]{chemmacros}
and define the custom environment I like to call subreactions:
\makeatletter
\newenvironment{subreactions}{%
\refstepcounter{reaction}%
\protected@edef\theparentequation{\thereaction}%
\setcounter{parentequation}{\value{reaction}}%
\setcounter{reaction}{0}%
\def\thereaction{\theparentequation\alph{reaction}}%
\ignorespaces
}{%
\setcounter{reaction}{\value{parentequation}}%
\ignorespacesafterend
}
\makeatother
I did not come up with that on my own, I got a lot of help and found inspiration in the work of others.
Here is the end result (screenshot from my thesis), the well-known water splitting reaction expressed as hydrogen reduction and water oxidation:

which was created with this code:
\begin{subreactions}\begin{reactions}%
4 \proton{} + 4 \electron{} &-> 2 \hydrogen{} && $\qquad\qquad\qquad\qquad$ \AddRxnDesc{Hydrogen~evolution} \"\label{rxn:hydrogen-evolution}\" \\%
2 \water{} + 4 \hole{} &-> \oxygen{} + 4 \proton{} && $\qquad\qquad\qquad\qquad$ \AddRxnDesc{Oxygen~evolution} \"\label{rxn:oxygen-evolution}\"%
\end{reactions}\end{subreactions}%
\addtocounter{reaction}{-1}%
\vspace{-\baselineskip}%
% note that the following lengths must be adjusted if
% the horizontal extent of any reactions are changed!
\hspace{13mm}%
\begin{minipage}{59mm}%
\vspace{-\baselineskip}%
\hrulefill%
\end{minipage}%
\begin{reaction}%
\qquad{}\qquad{}\quad{} 2 \water\lqd{} -> 2 \hydrogen\gas{} + \oxygen\gas{} $\quad\enspace\enspace E^0=\qty{1.23}{\voltNHE}$ \AddRxnDesc{Overall~water~splitting} \"\label{rxn:water-splitting}\"%
\end{reaction}%I just realized why my plays keep re-running roles when running a certain role.
It is because I have dutifully replicated the same parameters used in the play for each role in the dependencies list, which includes the tags parameter.
So when I call the play with --tags R, the R role (which is tagged eponymously) triggers, but also any role in the play which lists R in its dependencies, because I tagged the dependencies!
The solution is obvious and I am embarrassed it has taking me so long to realize: do not tag roles in the dependencies list!
Considered because I was trying to answer the question:
Can we use a different R version per directory/project?
With my R role it has been easy to maintain multiple different R versions on a server. But I have not really been able to pick-and-choose which R version to use with any particular project since there was only one version symlinked globally (/usr/local/bin/R -> ...).
Could we not set a different version locally, in a particular R project?
- https://github.com/r-lib/rig - this would do it, but does much more than I want, would interfere with my Ansible role
- https://www.monicathieu.com/posts/2024-05-21-multiple-r-versions.html
- https://support.posit.co/hc/en-us/articles/200486138-Changing-R-versions-for-the-RStudio-Desktop-IDE -
export RSTUDIO_WHICH_R=/usr/local/bin/R - https://github.com/vubiostat/Renv - good, but last commit 13 yrs ago
- https://direnv.net - this probably fits the bill
- https://github.com/hyperupcall/autoenv - similar to
direnvbut smaller in scope - https://github.com/jdx/mise - direnv, make and asdf all in one tool https://news.ycombinator.com/item?id=34583080
- https://github.com/untitaker/quickenv - like
direnvbut less intrusive, more light-weight - https://asdf-vm.com
- https://modules.sourceforge.net - Environment Modules, the OG in this space
apt install modules - https://github.com/TACC/Lmod - LMod, this is what's used by UPPMAX
asdf
After reading about it a little, I get the feeling it would be more cumbersome than direnv.
I am not sure I understood correctly, but sounds like the R plugin actually wants to manage the
entire R installation (essentially what rig does).
- https://github.com/asdf-vm/asdf
- https://asdf-vm.com/guide/introduction.html
- https://github.com/asdf-community/asdf-r - community plugin for R
direnv
I cannot find anyone talking about direnv with R on the web. Weird.
- https://direnv.net/#man/direnv.1
- https://direnv.net/#man/direnv-stdlib.1
- https://perrotta.dev/2022/01/direnv-automate-your-environment-variables
- https://rnorth.org/practical-direnv
- https://rnorth.org/more-practical-direnv
- https://pinnsg.com/direnv-take-control-of-your-development-environment
- https://www.digitalocean.com/community/tutorials/how-to-manage-python-with-pyenv-and-direnv
- https://shivamarora.medium.com/a-guide-to-manage-your-environment-variables-in-a-better-way-using-direnv-2c1cd475c8e
- https://platfrastructure.life/post/direnv
- https://github.com/direnv/direnv/issues/73 - some quite interesting example code here
- https://thelinuxcode.com/managing-per-directory-environment-variables-effortlessly-with-direnv
[So what I want] is a "shim" binary that dispatch to the desired binary
https://mise.jdx.dev/dev-tools/shims.htmlThe
.envrcfile is treated like a shell script, where you can also list arbitrary
shell commands that you want to be executed when you enter a project directory.
http://rednafi.com/misc/direnv/#why-envrc-file-and-not-just-a-plain-env-file
My direnv example
Machine in question is Ubuntu 22.04 x64.
$ apt install direnv
$ printf 'if hash direnv >/dev/null 2>&1; then\n eval \"$(direnv hook bash)\"\nfi' >> ~/.bashrc
In the R project directory, I created a subdirectory bin (for convenience) and created a symlink to the R binary I wanted, naming it R. Also added this subdirectory to .gitignore (and .Rbuildignore if it's an R package).
In the package directory I created .envrc containing simply:
PATH_add bin
And enabled with direnv allow the first time I cd into the directory.
Now the R command defined in bin successfully overrides the system-wide command:
$ ls -l `which R`
lrwxrwxrwx 1 taha taha 18 maj 3 21:47 /media/bay/R/periodicdata/bin/R -> /opt/R/4.5.0/bin/R
Note that this works in the terminal. I am pretty sure we will need to do more to have IDEs such as RStudio Server or Codium Server take heed on a per-directory basis. Will investigate further as time permits.
Support for direnv in RStudio Server
In RStudio Server the built-in terminal behaves like any terminal and respects our direnv config, but the built-in "R Console" does not, and neither do the other built-in buttons, Knit, etc. So a lot of stuff will use the wrong R version. Unfortunately Posit still to this day lock their "multiple versions of R" functionality behind a "Pro" license, so that cannot help us.
I guess one (really ugly) work-around would be to run multiple RStudio Server instances, each with a different hard-coded R version: export RSTUDIO_WHICH_R=.... For R package development it's primarily R-release and R-devel that matters, so it's not unworkable. And I have been known to run multiple instances anyway (one per LXC container).
Support for direnv in VSCodium or Code Server
You must install the direnv extension.
In addition, I recommend you reset r.rpath.linux setting in the workspace to:
{ "settings": { "r.rpath.linux": "R" } }
because otherwise VSCodium will use the default R version during startup (before direnv takes effect) which causes lots of warnings about missing packages such as jsonlite or languageserver.
This works not only in code-server but also in VSCodium on the desktop (assuming you have installed direnv on the system) and when using VSCodium with the Remote SSH extension.
- https://github.com/direnv/direnv/wiki/VSCode recommends https://open-vsx.org/extension/mkhl/direnv
- https://github.com/direnv/direnv-vscode (source code of mkhl/direnv, also on https://codeberg.org/mkhl/vscode-direnv although slightly outdated compared to github)
- https://github.com/cab404/vscode-direnv - another VSCode extension, but explicitly superseded by mkhl version above
- https://mtlynch.io/notes/zig-vscode-nix
- https://github.com/direnv/direnv/issues/231 https://marketplace.visualstudio.com/items?itemName=Rubymaniac.vscode-direnv
- https://discourse.nixos.org/t/using-direnv-nix-shell-and-vscode/17225/10
direnv executes arbitrary shell scripts so this extension requires trusted workspaces
More links and notes
- https://github.com/rstudio/renv/issues/254 - How to deal with different versions of R?
- https://stackoverflow.com/questions/63291613/how-to-set-r-version-in-rproj-file - that's not possible
- https://support.posit.co/hc/en-us/articles/200486138-Changing-R-versions-for-the-RStudio-Desktop-IDE
- https://docs.ropensci.org/rix - R package
rixhandles per-project environment with Nix, by Bruno Rodrigues.
R versions
At present 2025-05-03:
- R-devel is NA
- R-patched is NA
- R-release is 4.5.0
- R-oldrel is 4.4.3
This is best determined using the rversions:: package!
Play this unique twist on the classic snake game, where your mission is to eat as many apples as you can given their location and navigate the globe.
This was fun :-)
Perhaps the snake moves a tad too fast for my liking, but I imagine that could depend on clock speed or similar.
Via https://googlemapsmania.blogspot.com/2025/04/snakes-on-planet.html?m=1
Something I would like to be able to do: mirror all my issues that I own from across various code forges (Github, Codeberg, etc.) into a single list of my choosing, for example, as an RSS feed or a Markdown list or whatever.
Actually, as RSS feeds this already works (one feed per forge).
But what I have in mind would go further than that. Ideally, any tags associated with each issue should be visible, and full-text search should be possible. Also, the list should clearly indicate closed issues as such.
The point is, to have a single place to check to remind myself of any issues I have opened. This kind of mirroring would also insulate you from short-term service interruptions on the forge, assuming the project in questionn is still available locally (which it always is, thanks to git). But moreso, this would also help as a sort of backup in case the forge went away completely (say Github gets sold and scuppered, or whatever).
I am considering this today because I just spent the better part of the afternoon moving, manually, "tasks" from my Nextcloud instance to their proper place as issues on my Codeberg repos.
I don't know how to achieve this. I am pretty sure it needs to involve authentication to each forge. Is anyone aware of some existing work in this vein?
Links
- https://github.com/jlord/offline-issues Here is a rudimentary Node.js project. Unfortunately does not appear maintained, last commit 8 years ago. Only for Github, and requires your password (no auth token support).