-## Jumbotron
-
-It's big and in your face.
-
----
-
-You can still use Markdown syntax inside HTML blocks, if you are careful.
-
-Button
-
-
-## Labels Hi!
-
-Span elements work inside Markdown headings.
-
-
-## Cards
-
-Put a border with soft round corners around your content.
-
-
-
-## Card decks
-
-These require some more work.
-You can use the `\[[!img]]` directive, but make sure to add `class="card-img-top"` or `class="card-img-bottom"` where appropriate.
-For images in cards to work properly, they need to have their width forced to 100% of their container.
-This is done in the `style.css` file that comes with ikistrap.
-
-Another issue is that due to all the nested HTML tags, even with `markdown="1"`, Markdown markup does not get parsed anymore.
-
-
-
-## Card columns
-
-These can be created by writing the outer card-columns `div` elements yourself,
-and using `\[[!inline]]` with `template="simplecard"` to generate the cards.
-
-
-[[!inline pages="sample_text/* and !*/Discussion" template="simplecard" feeds="no"]]
-
-
-
-## Carousel
-
-These can be created by writing the outer two carousel `div` elements yourself,
-and using `\[[!inline]]` with `template="carouselpage"` to generate the carousel items.
-
-
-
-
-
-[[!inline pages="sample_text/* and !*/Discussion" template="carouselpage" feeds="no"]]
-
-
-
-## Progress bars
-
-Ikistrap also provides a progress directive which works in the same way as the progress plugin,
-but it also allows an extra class to be specified to change the style per bar.
-
-[[!progress totalpages="* and !*/Discussion" donepages="*/Discussion"]]
-[[!progress percent="33%"]]
-[[!progress percent="66%" class="progress-success progress-striped"]]
-
-## Other stuff
-
-Goes here.
-
diff --git a/Bootstrap_features/index.html b/Bootstrap_features/index.html
new file mode 100644
index 0000000..dc0571d
--- /dev/null
+++ b/Bootstrap_features/index.html
@@ -0,0 +1,282 @@
+
+
+
+
+
+
+
+
+
+
+ Bootstrap features - Ayakael
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Bootstrap features
+
This page will contain a display of various features from Bootstrap.
+They require some manual HTML tags. Note that not all Markdown parsers
+allow Markdown markup inside all HTML tags. In the case of ikiwiki,
+adding markdown="1" to div elements usually
+allows markup to be used inside them. For a full list of features
+provided by Bootstrap 4, go to http://v4-alpha.getbootstrap.com/getting-started/introduction/.
+
+
Jumbotron
+
It’s big and in your face.
+
+
You can still use Markdown syntax inside HTML blocks, if you are
+careful.
Put a border with soft round corners around your content.
+
+
Card decks
+
These require some more work. You can use the [[!img ]]
+directive, but make sure to add class="card-img-top" or
+class="card-img-bottom" where appropriate. For images in
+cards to work properly, they need to have their width forced to 100% of
+their container. This is done in the style.css file that
+comes with ikistrap.
+
Another issue is that due to all the nested HTML tags, even with
+markdown="1", Markdown markup does not get parsed
+anymore.
+
+
+
+[[!img Error: Image::Magick is not
+installed]]
+
+
+A lemon shark and his little friends are out for a swim.
+
These can be created by writing the outer card-columns
+div elements yourself, and using [[!inline ]]
+with template="simplecard" to generate the cards.
+
+
[[!inline Error: failed to process template
+simplecard.tmpl: template simplecard.tmpl not found
+]]
+
+
Carousel
+
These can be created by writing the outer two carousel
+div elements yourself, and using [[!inline ]]
+with template="carouselpage" to generate the carousel
+items.
+
+
+
+
+
+
[[!inline Error: failed to process template
+carouselpage.tmpl: template carouselpage.tmpl not found
+]]
Ikistrap also provides a progress directive which works in the same
+way as the progress plugin, but it also allows an extra class to be
+specified to change the style per bar.
Sed eget turpis a pede tempor malesuada. Vivamus quis mi at leo
+pulvinar hendrerit. Cum sociis natoque penatibus et magnis dis
+parturient montes, nascetur ridiculus mus. Pellentesque aliquet lacus
+vitae pede. Nullam mollis dolor ac nisi. Phasellus sit amet urna.
+Praesent pellentesque sapien sed lacus. Donec lacinia odio in odio. In
+sit amet elit. Maecenas gravida interdum urna. Integer pretium, arcu
+vitae imperdiet facilisis, elit tellus tempor nisi, vel feugiat ante
+velit sit amet mauris. Vivamus arcu. Integer pharetra magna ac lacus.
+Aliquam vitae sapien in nibh vehicula auctor. Suspendisse leo mauris,
+pulvinar sed, tempor et, consequat ac, lacus. Proin velit. Nulla semper
+lobortis mauris. Duis urna erat, ornare et, imperdiet eu, suscipit sit
+amet, massa. Nulla nulla nisi, pellentesque at, egestas quis, fringilla
+eu, diam.
Nulla facilisi. Nunc volutpat. Vestibulum ante ipsum primis in
+faucibus orci luctus et ultrices posuere cubilia Curae; Ut sit amet orci
+vel mauris blandit vehicula. Nullam quis enim. Integer dignissim viverra
+velit. Curabitur in odio. In hac habitasse platea dictumst. Ut
+consequat, tellus eu volutpat varius, justo orci elementum dolor, sed
+imperdiet nulla tellus ut diam. Vestibulum ipsum ante, malesuada quis,
+tempus ac, placerat sit amet, elit.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed at ante.
+Mauris eleifend, quam a vulputate dictum, massa quam dapibus leo, eget
+vulputate orci purus ut lorem. In fringilla mi in ligula. Pellentesque
+aliquam quam vel dolor. Nunc adipiscing. Sed quam odio, tempus ac,
+aliquam molestie, varius ac, tellus. Vestibulum ut nulla aliquam risus
+rutrum interdum. Pellentesque lorem. Curabitur sit amet erat quis risus
+feugiat viverra. Pellentesque augue justo, sagittis et, lacinia at,
+venenatis non, arcu. Nunc nec libero. In cursus dictum risus. Etiam
+tristique nisl a nulla. Ut a orci. Curabitur dolor nunc, egestas at,
+accumsan at, malesuada nec, magna.
+
+
+
+
+
+
+
+
+
+
Here is an example of inlining with actions enabled:
Donec semper, sem nec tristique tempus, justo neque commodo nisl, ut
+gravida sem tellus suscipit nunc. Aliquam erat volutpat. Ut tincidunt
+pretium elit. Aliquam pulvinar. Nulla cursus. Suspendisse potenti. Etiam
+condimentum hendrerit felis. Duis iaculis aliquam enim. Donec dignissim
+augue vitae orci. Curabitur luctus felis a metus. Cum sociis natoque
+penatibus et magnis dis parturient montes, nascetur ridiculus mus. In
+varius neque at enim. Suspendisse massa nulla, viverra in, bibendum
+vitae, tempor quis, lorem.
Donec dapibus orci sit amet elit. Maecenas rutrum ultrices lectus.
+Aliquam suscipit, lacus a iaculis adipiscing, eros orci pellentesque
+nisl, non pharetra dolor urna nec dolor. Integer cursus dolor vel magna.
+Integer ultrices feugiat sem. Proin nec nibh. Duis eu dui quis nunc
+sagittis lobortis. Fusce pharetra, enim ut sodales luctus, lectus arcu
+rhoncus purus, in fringilla augue elit vel lacus. In hac habitasse
+platea dictumst. Aliquam erat volutpat. Fusce iaculis elit id tellus. Ut
+accumsan malesuada turpis. Suspendisse potenti. Vestibulum lacus augue,
+lobortis mattis, laoreet in, varius at, nisi. Nunc gravida. Phasellus
+faucibus. In hac habitasse platea dictumst. Integer tempor lacus eget
+lectus. Praesent fringilla augue fringilla dui.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/README.md b/README.md
deleted file mode 100644
index feafcfe..0000000
--- a/README.md
+++ /dev/null
@@ -1,82 +0,0 @@
-# ayakael.net
-Upstream: https://ayakael.net/forge/ayakael.net/actions
-
-
-
-
-## Forgejo Actions
-
-This project's static Pages are built by Forgejo Actions, following the steps
-defined in [`.forgejo/workflows/pages.yaml`](.forgejo/workflows/pages.yaml).
-That builds this website using ikiwiki, and pushes the build artifacts to the
-`public` branch.
-
-The `public` branch has its own workflow following steps defined in
-[`forgejo/workflows/deploy.yaml`](https://ayakael.net/forge/ayakael.net/src/branch/public/.forgejo/workflows/deploy.yaml)
-that uploads the artifacts to a remote HTTP server for deployment in
-production. This workflow is automatically updated from `main` so that `public`
-should never be manually modified.
-
-The deployment is done by a simple remote git push via SSH to a non-bare repo
-where `git config receive.denyCurrentBranch` is set as `updateInstead`. This
-allows this repo to be checked out as `public`, allowing it to be a root for
-your favorite HTTP server.
-
-The following secrets are expected to be set for operation:
-* PAGES_PRIVKEY: SSH private key that is used to push to the HTTP server's git
-repo
-* PAGES_TOKEN: Forgejo application token used to push to `public` branch.
-
-The following variables are expected to be set for operation:
-* PAGES_TARGET: SSH target for HTTP server's git repo, following this format:
-user@example.net:/path/to/http/repo
-
-## Building locally
-
-To work locally with this project, you'll have to follow the steps below:
-
-1. Fork, clone or download this project
-1. Install ikiwiki:
- * [mac][]
- * [linux][]
- * [source][]
-1. Generate the website: `ikiwiki --setup ikiwiki.setup`
-1. Start http-server: `./test-server.sh`
-1. Preview your project: open 127.0.0.1:8080 in your browser
-
-Read more at ikiwiki's [documentation][].
-
-## Contributing
-
-1. Fork the main ayakael.net repo.
-
-2. Checkout the forked repository.
-
- - `git clone ssh://git@ayakael.net/$USER/ayakael.net`
- - `cd ayakael.net`
-
-3. Make your changes.
-
-4. Do local build.
-
- - `ikiwiki --setup ikiwiki.setup`
-
-5. Fix any errors that come up and rebuild until it works locally.
-
-6. Commit the changes to the git repo in a git branch
-
- - `git checkout -b `
- - `git add` changes
- - `git commit -m 'content/index: descriptive description'`
- - `git push`
-
-7. Create a merge request with your changes by following link in server response.
-
-8. Once the tests in the merge-request pass, and reviewers are happy, your changes
- will be merged.
-
-[ikiwiki]: https://ikiwiki.info/
-[source]: https://ikiwiki.info/install/
-[linux]: https://ikiwiki.info/setup/
-[mac]: https://ikiwiki.info/tips/ikiwiki_on_mac_os_x/
-[documentation]: https://ikiwiki.info/
diff --git a/README/index.html b/README/index.html
new file mode 100644
index 0000000..63a0148
--- /dev/null
+++ b/README/index.html
@@ -0,0 +1,217 @@
+
+
+
+
+
+
+
+
+
+
+ README - Ayakael
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This project's static Pages are built by Forgejo Actions, following the steps
+defined in .forgejo/workflows/pages.yaml.
+That builds this website using ikiwiki, and pushes the build artifacts to the
+public branch.
+
+
The public branch has its own workflow following steps defined in
+forgejo/workflows/deploy.yaml
+that uploads the artifacts to a remote HTTP server for deployment in
+production. This workflow is automatically updated from main so that public
+should never be manually modified.
+
+
The deployment is done by a simple remote git push via SSH to a non-bare repo
+where git config receive.denyCurrentBranch is set as updateInstead. This
+allows this repo to be checked out as public, allowing it to be a root for
+your favorite HTTP server.
+
+
The following secrets are expected to be set for operation:
+* PAGES_PRIVKEY: SSH private key that is used to push to the HTTP server's git
+repo
+* PAGES_TOKEN: Forgejo application token used to push to public branch.
+
+
The following variables are expected to be set for operation:
+* PAGES_TARGET: SSH target for HTTP server's git repo, following this format:
+user@example.net:/path/to/http/repo
+
+
Building locally
+
+
To work locally with this project, you'll have to follow the steps below:
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/blog.fr.po b/blog.fr.po
deleted file mode 100644
index cc2d2f9..0000000
--- a/blog.fr.po
+++ /dev/null
@@ -1,71 +0,0 @@
-# SOME DESCRIPTIVE TITLE
-# Copyright (C) YEAR Free Software Foundation, Inc.
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR , YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: \n"
-"POT-Creation-Date: 2026-01-03 13:52-0500\n"
-"PO-Revision-Date: 2026-01-03 13:54-0500\n"
-"Last-Translator: \n"
-"Language-Team: \n"
-"Language: fr\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 3.8\n"
-
-#. type: Plain text
-#, no-wrap
-msgid "[[!meta title=\"Blog\"]]\n"
-msgstr ""
-
-#. type: Plain text
-#, no-wrap
-msgid "\n"
-msgstr ""
-
-#. type: Title #
-#, no-wrap
-msgid "Latest"
-msgstr ""
-"Récent\n"
-"(basculer vers l'anglais pour tout mon contenu)"
-
-#. type: Plain text
-#, no-wrap
-msgid ""
-"[[!inline pages=\"\n"
-"(\n"
-" page(blog/*)\n"
-" or tagged(blog)\n"
-")\n"
-"and !blog/*/*\n"
-"and !blog/*fr*\n"
-"and !tagged(draft)\n"
-"and !tagged(redirection)\"\n"
-"archive=yes\n"
-"title=\"Ayakael - Blog\"\n"
-"description=\"For those who wish to follow my goings\"\n"
-"feedshow=\"10\"\n"
-"actions=yes\n"
-"trail=yes\n"
-"]]\n"
-msgstr ""
-"[[!inline pages=\"\n"
-"(\n"
-" page(blog/*fr*)\n"
-" or tagged(blog)\n"
-")\n"
-"and !blog/*/*\n"
-"and !tagged(draft)\n"
-"and !tagged(redirection)\"\n"
-"archive=yes\n"
-"title=\"Ayakael - Blog\"\n"
-"description=\"Pour ceux et celles qui veulent suivre mes mises à jour\"\n"
-"feedshow=\"10\"\n"
-"actions=yes\n"
-"trail=yes\n"
-"]]\n"
diff --git a/blog.mdwn b/blog.mdwn
deleted file mode 100644
index e24409c..0000000
--- a/blog.mdwn
+++ /dev/null
@@ -1,23 +0,0 @@
-[[!meta title="Blog"]]
-
-
-
-# Latest
-
-[[!inline pages="
-(
- page(blog/*)
- or tagged(blog)
-)
-and !blog/*/*
-and !blog/*fr*
-and !tagged(draft)
-and !tagged(redirection)"
-archive=yes
-title="Ayakael - Blog"
-description="For those who wish to follow my goings"
-feedshow="10"
-actions=yes
-trail=yes
-]]
-
diff --git a/blog.pot b/blog.pot
deleted file mode 100644
index 3447c1a..0000000
--- a/blog.pot
+++ /dev/null
@@ -1,53 +0,0 @@
-# SOME DESCRIPTIVE TITLE
-# Copyright (C) YEAR Free Software Foundation, Inc.
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR , YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2026-01-03 13:54-0500\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME \n"
-"Language-Team: LANGUAGE \n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#. type: Plain text
-#, markdown-text, no-wrap
-msgid "[[!meta title=\"Blog\"]]\n"
-msgstr ""
-
-#. type: Plain text
-#, markdown-text, no-wrap
-msgid "\n"
-msgstr ""
-
-#. type: Title #
-#, markdown-text, no-wrap
-msgid "Latest"
-msgstr ""
-
-#. type: Plain text
-#, markdown-text, no-wrap
-msgid ""
-"[[!inline pages=\"\n"
-"(\n"
-" page(blog/*)\n"
-" or tagged(blog)\n"
-")\n"
-"and !blog/*/*\n"
-"and !blog/*fr*\n"
-"and !tagged(draft)\n"
-"and !tagged(redirection)\"\n"
-"archive=yes\n"
-"title=\"Ayakael - Blog\"\n"
-"description=\"For those who wish to follow my goings\"\n"
-"feedshow=\"10\"\n"
-"actions=yes\n"
-"trail=yes\n"
-"]]\n"
-msgstr ""
diff --git a/blog/2026-01-02-foss-recap-2025.md b/blog/2026-01-02-foss-recap-2025.md
deleted file mode 100644
index a993cc0..0000000
--- a/blog/2026-01-02-foss-recap-2025.md
+++ /dev/null
@@ -1,126 +0,0 @@
-[[!meta title="FOSS Recap 2025"]]
-
-# FOSS Recap 2025
-
-
-
-Following many other developpers, here is a recap of all the noticeable FOSS related projects that I have contributed to in 2025.
-
-## Alpine Linux
-
-As of beginning of 2026, I maintain a total of [178](https://pkgs.alpinelinux.org/packages?name=&branch=edge&repo=&arch=x86_64&origin=&flagged=&maintainer=Antoine+Martin+%28ayakael%29) packages for Alpine Linux, in addition to 26 that I maintain in my [own repo](https://ayakael.net/forge/ayaports).
-
-#### Aports
-
-During the last year, I pushed a total of 451 commits (top 12 committer!) to Alpine Linux [aports](https://gitlab.alpinelinux.org/alpine/aports). Almost half were updates to python packages (231).
-
-I also added 14 new aports to Alpine Linux repositories:
-
-* dotnet10-{sdk,runtime,stage0}
-* koreader
-* nwg-menu
-* openterface-qt
-* pinenote-service
-* pneink-theme
-* py3-coverage-conditional-plugin
-* py3-cron-descriptor
-* py3-epmeh
-* py3-django-celery-beat
-* py3-django-ninja
-* py3-python-crontab
-* rot8
-* skiasharp
-
-I also took maintainership of 3 aports:
-
-* raspberrypi-usbbot
-* looking-glass
-* arm-trusted-firmware
-
-The last one (arm-trusted-firmware) is my first main package!
-
-That said, this looks to be less activity than last year, where I pushed 605 commits, added 69 new aports, and took maintainership of 17 packages.
-
-#### Ayaports
-
-As mentionned, I maintain my own port repo, which acts as my staging repo, and allows me to backports packages from Alpine's testing to latest stable Alpine release. Ignoring my backports, I pushed 58 updates to my staging packages and added 8 new aports.
-
-I improved a lot on my package monitoring CI that alerts me (by creating a new issue on my forge) whenever a package needs updating. I pushed 78 commits to this, mostly related to adding exceptions and rules to my CI. Notably, I added the ability to track minor and patch releases on package, so I get alerted to new minor relases on Alpine's stable releases.
-
-Indeed, this is still less activity than last year, where I added 48 new aports to my staging repo, and pushed 282 new commits.
-
-#### QubesOS template
-
-I created a few years ago an Alpine Linux template for QubesOS. I pushed 69 commits to this repo, and ported the template to Qubes' latest version. I have not done much in improvements to this, given that I hadn't had the time to push this project further.
-
-## postmarketOS
-
-I pushed a total of 60 commits in the last year, all centered around two devices: the PineNote and the uConsole.
-
-#### pine64's PineNote
-
-I took maintainership of the PineNote port, having made many improvements. Notably:
-
-* Upgraded the linux kernel to latest mainline (6.18)
-* Ported hrdl's patchset that uses clever logics to improve e-ink response time
-* Upgraded the u-boot to latest release, and now boots using EFI
-* Made the port community ready, and submitted a merge request to move the device to community
-
-#### ClockworkPi's uConsole
-
-I contributed to the uConsole ports by extending the raspberrypi support from the cm4 to the cm5 and cm3. I also added support to the radxa-cm5, but unfortunately the port was removed as the build for the downstream kernel was problematic.
-
-## Ilot
-
-In 2021, I started a [small Nextcloud instance](https://ilot.io) to be used by community and student groups in Montreal. In 2025, I made many improvement to the service. Notably, I finally got a team together to improve the bus factor, and migrated the services to a new Ampere based server cluster. Our services are packaged in Alpine packages, thus buildable using a [repo](https://forge.ilot.io/ilot/iports). I pushed 102 commits, mostly related to our authentik package and its dependencies.
-
-## Other
-
-I attended this year's Hackers on Planet Earth and met some very cool people! My favorite talk was *Marlon Kautz's Data Autonomy: Counter-Surveillance Strategies for Civil Society*.
-
-## Plans for 2026
-
-I certainly feel like I stepped back from contributing to FOSS this year, as I got busy with other obligations. I'd like to change that, and better organize my goals to get a momentum going. Here are a few goals and projets that I'd like to work on.
-
-#### postmarketOS
-
-I'd like to get myself involved more with postmarketOS. I think it is a fantastic project, and I think this blasts Alpine Linux into very important and exciting territories. This was my first year getting involved, and I'd like to contribute more. Notably:
-
-* Get the PineNote pmOS port in community, and improve e-ink support on the mobile UIs pmOS ships with for the v26.06 release
-* Improve uConsole support with the Radxa CM5 module so that it can at least be reintroduced in testing. This would involve using the mainline kernel.
-* Add support for the MNT reform next laptop
-* Add support for zfs
-* Become a trusted contributor to help with MR reviews
-* Become a financial contributor to the pmOS project
-
-#### Alpine Linux
-
-I don't think I'll improve my odds this year in Alpine Linux. I've been a maintainer since 2022 when I first merged the .NET 3.1 compiler. I've had a lot of fun since then, but the project never felt accessible enough for me to get involved more. At best, maintaining Alpine packages feels like my morning sudoku, at worst it feels like a chore. In any case, I don't plan on taking on more, but I'd like to improve my current packages:
-
-* Finish the dotnet10 port to riscv64
-* Introduce a test suite for electron, so that I can move electron to community
-* Improve raspberrypi-usbboot and move it to community
-* Add rockchiprs as a new aport
-
-#### Qubes
-
-This project has been in maintainance mode for a long while, mostly by lack of time to improve it. Some longstanding goals that I'd like to work-on this year includes:
-
-* Upstream the package building, so that builds are done on upstream hardware.
-* Make the template buildable on the new (v2) version of the builder
-* (maybe) Get the template working for system Appvms
-* Get a postmarketOS template going
-
-#### Ilot
-
-Most work in 2026 for ilot will involve getting a better governance structure going, and move our servers out of my server closet. I also aim to help more student unions migrate off of Google Drive to our infrastructure, and improve on service availability.
-
-#### Documentation
-
-I'd like to get better at documenting my different projects. Contributing to postmarketOS' wiki has been great fun and practice, and the last few years of integrating infrastructure as code approaches has helped make my process more transparent. Ilot's documentation is also very incomplete. This blog might be a good place to document progress on different projets, but I don't have a consolidated knowledge base. In any case, this year I practiced taking more notes down, so that I have some knowledge that I can eventually organize.
-
--
-
-Well that's it folks!
-
-Happy new years!
diff --git a/blog/2026-01-02-foss-recap-2025/index.html b/blog/2026-01-02-foss-recap-2025/index.html
new file mode 100644
index 0000000..3054ff3
--- /dev/null
+++ b/blog/2026-01-02-foss-recap-2025/index.html
@@ -0,0 +1,271 @@
+
+
+
+
+
+
+
+
+
+
+ FOSS Recap 2025 - Ayakael
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
FOSS Recap 2025
+
+
+
+
Following many other developpers, here is a recap of all the noticeable FOSS related projects that I have contributed to in 2025.
+
+
Alpine Linux
+
+
As of beginning of 2026, I maintain a total of 178 packages for Alpine Linux, in addition to 26 that I maintain in my own repo.
+
+
Aports
+
+
During the last year, I pushed a total of 451 commits (top 12 committer!) to Alpine Linux aports. Almost half were updates to python packages (231).
+
+
I also added 14 new aports to Alpine Linux repositories:
+
+
+
dotnet10-{sdk,runtime,stage0}
+
koreader
+
nwg-menu
+
openterface-qt
+
pinenote-service
+
pneink-theme
+
py3-coverage-conditional-plugin
+
py3-cron-descriptor
+
py3-epmeh
+
py3-django-celery-beat
+
py3-django-ninja
+
py3-python-crontab
+
rot8
+
skiasharp
+
+
+
I also took maintainership of 3 aports:
+
+
+
raspberrypi-usbbot
+
looking-glass
+
arm-trusted-firmware
+
+
+
The last one (arm-trusted-firmware) is my first main package!
+
+
That said, this looks to be less activity than last year, where I pushed 605 commits, added 69 new aports, and took maintainership of 17 packages.
+
+
Ayaports
+
+
As mentionned, I maintain my own port repo, which acts as my staging repo, and allows me to backports packages from Alpine's testing to latest stable Alpine release. Ignoring my backports, I pushed 58 updates to my staging packages and added 8 new aports.
+
+
I improved a lot on my package monitoring CI that alerts me (by creating a new issue on my forge) whenever a package needs updating. I pushed 78 commits to this, mostly related to adding exceptions and rules to my CI. Notably, I added the ability to track minor and patch releases on package, so I get alerted to new minor relases on Alpine's stable releases.
+
+
Indeed, this is still less activity than last year, where I added 48 new aports to my staging repo, and pushed 282 new commits.
+
+
QubesOS template
+
+
I created a few years ago an Alpine Linux template for QubesOS. I pushed 69 commits to this repo, and ported the template to Qubes' latest version. I have not done much in improvements to this, given that I hadn't had the time to push this project further.
+
+
postmarketOS
+
+
I pushed a total of 60 commits in the last year, all centered around two devices: the PineNote and the uConsole.
+
+
pine64's PineNote
+
+
I took maintainership of the PineNote port, having made many improvements. Notably:
+
+
+
Upgraded the linux kernel to latest mainline (6.18)
+
Ported hrdl's patchset that uses clever logics to improve e-ink response time
+
Upgraded the u-boot to latest release, and now boots using EFI
+
Made the port community ready, and submitted a merge request to move the device to community
+
+
+
ClockworkPi's uConsole
+
+
I contributed to the uConsole ports by extending the raspberrypi support from the cm4 to the cm5 and cm3. I also added support to the radxa-cm5, but unfortunately the port was removed as the build for the downstream kernel was problematic.
+
+
Ilot
+
+
In 2021, I started a small Nextcloud instance to be used by community and student groups in Montreal. In 2025, I made many improvement to the service. Notably, I finally got a team together to improve the bus factor, and migrated the services to a new Ampere based server cluster. Our services are packaged in Alpine packages, thus buildable using a repo. I pushed 102 commits, mostly related to our authentik package and its dependencies.
+
+
Other
+
+
I attended this year's Hackers on Planet Earth and met some very cool people! My favorite talk was Marlon Kautz's Data Autonomy: Counter-Surveillance Strategies for Civil Society.
+
+
Plans for 2026
+
+
I certainly feel like I stepped back from contributing to FOSS this year, as I got busy with other obligations. I'd like to change that, and better organize my goals to get a momentum going. Here are a few goals and projets that I'd like to work on.
+
+
postmarketOS
+
+
I'd like to get myself involved more with postmarketOS. I think it is a fantastic project, and I think this blasts Alpine Linux into very important and exciting territories. This was my first year getting involved, and I'd like to contribute more. Notably:
+
+
+
Get the PineNote pmOS port in community, and improve e-ink support on the mobile UIs pmOS ships with for the v26.06 release
+
Improve uConsole support with the Radxa CM5 module so that it can at least be reintroduced in testing. This would involve using the mainline kernel.
+
Add support for the MNT reform next laptop
+
Add support for zfs
+
Become a trusted contributor to help with MR reviews
+
Become a financial contributor to the pmOS project
+
+
+
Alpine Linux
+
+
I don't think I'll improve my odds this year in Alpine Linux. I've been a maintainer since 2022 when I first merged the .NET 3.1 compiler. I've had a lot of fun since then, but the project never felt accessible enough for me to get involved more. At best, maintaining Alpine packages feels like my morning sudoku, at worst it feels like a chore. In any case, I don't plan on taking on more, but I'd like to improve my current packages:
+
+
+
Finish the dotnet10 port to riscv64
+
Introduce a test suite for electron, so that I can move electron to community
+
Improve raspberrypi-usbboot and move it to community
+
Add rockchiprs as a new aport
+
+
+
Qubes
+
+
This project has been in maintainance mode for a long while, mostly by lack of time to improve it. Some longstanding goals that I'd like to work-on this year includes:
+
+
+
Upstream the package building, so that builds are done on upstream hardware.
+
Make the template buildable on the new (v2) version of the builder
+
(maybe) Get the template working for system Appvms
+
Get a postmarketOS template going
+
+
+
Ilot
+
+
Most work in 2026 for ilot will involve getting a better governance structure going, and move our servers out of my server closet. I also aim to help more student unions migrate off of Google Drive to our infrastructure, and improve on service availability.
+
+
Documentation
+
+
I'd like to get better at documenting my different projects. Contributing to postmarketOS' wiki has been great fun and practice, and the last few years of integrating infrastructure as code approaches has helped make my process more transparent. Ilot's documentation is also very incomplete. This blog might be a good place to document progress on different projets, but I don't have a consolidated knowledge base. In any case, this year I practiced taking more notes down, so that I have some knowledge that I can eventually organize.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/contact.fr.po b/contact.fr.po
deleted file mode 100644
index 5ae00cb..0000000
--- a/contact.fr.po
+++ /dev/null
@@ -1,69 +0,0 @@
-# SOME DESCRIPTIVE TITLE
-# Copyright (C) YEAR Free Software Foundation, Inc.
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR , YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: ayakael.net\n"
-"POT-Creation-Date: 2025-04-03 10:51-0400\n"
-"PO-Revision-Date: 2025-04-03 10:52-0400\n"
-"Last-Translator: \n"
-"Language-Team: ayakael \n"
-"Language: fr\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 3.5\n"
-
-#. type: Plain text
-#, no-wrap
-msgid "[[!meta title=\"Contact\"]]\n"
-msgstr "[[!meta title=\"Contact\"]]\n"
-
-#. type: Title #
-#, no-wrap
-msgid "How to contact me"
-msgstr "Comment me joindre"
-
-#. type: Plain text
-#, no-wrap
-msgid "\n"
-msgstr "\n"
-
-#. type: Plain text
-msgid ""
-"The best way to reach me is by email, use the ProtonMail-backed address: "
-"[antoine@ayakael.net](mailto:antoine@ayakael.net). If you contact me using a "
-"non-ProtonMail email, you can encrypt using [this PGP key](/keys/"
-"publickey.antoine.at.ayakael.net-72498db60f2a3d5786517585eba2a86db6fcb3ab.asc)."
-msgstr ""
-"La meilleure façon de me joindre est par courriel, en utilisant l'adresse "
-"soutenue par ProtonMail : [antoine@ayakael.net](mailto:antoine@ayakael.net). "
-"Si vous me contactez en utilisant un email autre qu'un de ProtonMail, vous "
-"pouvez le chiffrer en utilisant [cette clé PGP](/keys/"
-"publickey.antoine.at.ayakael.net-72498db60f2a3d5786517585eba2a86db6fcb3ab.asc)."
-
-#. type: Plain text
-msgid ""
-"You can also send me a direct message on my Mastodon account: "
-"[@agora.ilot.io@ayakael](https://agora.ilot.io/@ayakael)"
-msgstr ""
-"Vous pouvez également m'envoyer un message direct à mon compte Mastodon : "
-"[@agora.ilot.io@ayakael](https://agora.ilot.io/@ayakael)"
-
-#. type: Plain text
-msgid ""
-"Finally, you can send a message to [my Signal](https://signal.me/#eu/"
-"AoOsWsIcxLrP0hxNNk1HpU9RbZuBYwVfJkLYSLTptO816TwldtBMypTrPPhZH8Gv)"
-msgstr ""
-"Pour terminer, vous pouvez m'envoyer un message vers [mon Signal](https://"
-"signal.me/#eu/"
-"AoOsWsIcxLrP0hxNNk1HpU9RbZuBYwVfJkLYSLTptO816TwldtBMypTrPPhZH8Gv)"
-
-#. type: Plain text
-msgid "If you found an error on the site, you can report it to me by email."
-msgstr ""
-"Si vous avez trouvé une erreur sur le site, vous pouvez me la signaler par "
-"courriel."
diff --git a/contact.mdwn b/contact.mdwn
deleted file mode 100644
index 7422bd8..0000000
--- a/contact.mdwn
+++ /dev/null
@@ -1,13 +0,0 @@
-[[!meta title="Contact"]]
-
-# How to contact me
-
-
-
-The best way to reach me is by email, use the ProtonMail-backed address: [antoine@ayakael.net](mailto:antoine@ayakael.net). If you contact me using a non-ProtonMail email, you can encrypt using [this PGP key](/keys/publickey.antoine.at.ayakael.net-72498db60f2a3d5786517585eba2a86db6fcb3ab.asc).
-
-You can also send me a direct message on my Mastodon account: [@agora.ilot.io@ayakael](https://agora.ilot.io/@ayakael)
-
-Finally, you can send a message to [my Signal](https://signal.me/#eu/AoOsWsIcxLrP0hxNNk1HpU9RbZuBYwVfJkLYSLTptO816TwldtBMypTrPPhZH8Gv)
-
-If you found an error on the site, you can report it to me by email.
diff --git a/contact.pot b/contact.pot
deleted file mode 100644
index 7dae4b6..0000000
--- a/contact.pot
+++ /dev/null
@@ -1,60 +0,0 @@
-# SOME DESCRIPTIVE TITLE
-# Copyright (C) YEAR Free Software Foundation, Inc.
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR , YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2025-04-03 10:51-0400\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME \n"
-"Language-Team: LANGUAGE \n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#. type: Plain text
-#, markdown-text, no-wrap
-msgid "[[!meta title=\"Contact\"]]\n"
-msgstr ""
-
-#. type: Title #
-#, markdown-text, no-wrap
-msgid "How to contact me"
-msgstr ""
-
-#. type: Plain text
-#, markdown-text, no-wrap
-msgid "\n"
-msgstr ""
-
-#. type: Plain text
-#, markdown-text
-msgid ""
-"The best way to reach me is by email, use the ProtonMail-backed address: "
-"[antoine@ayakael.net](mailto:antoine@ayakael.net). If you contact me using a "
-"non-ProtonMail email, you can encrypt using [this PGP "
-"key](/keys/publickey.antoine.at.ayakael.net-72498db60f2a3d5786517585eba2a86db6fcb3ab.asc)."
-msgstr ""
-
-#. type: Plain text
-#, markdown-text
-msgid ""
-"You can also send me a direct message on my Mastodon account: "
-"[@agora.ilot.io@ayakael](https://agora.ilot.io/@ayakael)"
-msgstr ""
-
-#. type: Plain text
-#, markdown-text
-msgid ""
-"Finally, you can send a message to [my "
-"Signal](https://signal.me/#eu/AoOsWsIcxLrP0hxNNk1HpU9RbZuBYwVfJkLYSLTptO816TwldtBMypTrPPhZH8Gv)"
-msgstr ""
-
-#. type: Plain text
-#, markdown-text
-msgid "If you found an error on the site, you can report it to me by email."
-msgstr ""
diff --git a/contact/index.en.html b/contact/index.en.html
new file mode 100644
index 0000000..4d3b4f7
--- /dev/null
+++ b/contact/index.en.html
@@ -0,0 +1,165 @@
+
+
+
+
+
+
+
+
+
+
+ Contact - Ayakael
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
How to contact me
+
+
The best way to reach me is by email, use the ProtonMail-backed
+address: antoine@ayakael.net.
+If you contact me using a non-ProtonMail email, you can encrypt using this
+PGP key.
La meilleure façon de me joindre est par courriel, en utilisant
+l’adresse soutenue par ProtonMail : antoine@ayakael.net. Si vous me
+contactez en utilisant un email autre qu’un de ProtonMail, vous pouvez
+le chiffrer en utilisant cette
+clé PGP.
+
Vous pouvez également m’envoyer un message direct à mon compte
+Mastodon : @agora.ilot.io@ayakael
+
Pour terminer, vous pouvez m’envoyer un message vers mon
+Signal
+
Si vous avez trouvé une erreur sur le site, vous pouvez me la
+signaler par courriel.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/generated.txt b/generated.txt
new file mode 100644
index 0000000..51bc74d
--- /dev/null
+++ b/generated.txt
@@ -0,0 +1 @@
+Wed May 20 09:38:23 EDT 2026
diff --git a/guides.fr.po b/guides.fr.po
deleted file mode 100644
index 39ced3e..0000000
--- a/guides.fr.po
+++ /dev/null
@@ -1,66 +0,0 @@
-# SOME DESCRIPTIVE TITLE
-# Copyright (C) YEAR Free Software Foundation, Inc.
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR , YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: \n"
-"POT-Creation-Date: 2026-01-03 13:57-0500\n"
-"PO-Revision-Date: 2026-01-03 13:58-0500\n"
-"Last-Translator: \n"
-"Language-Team: \n"
-"Language: fr\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 3.8\n"
-
-#. type: Plain text
-#, no-wrap
-msgid "[[!meta title=\"Guides\"]]\n"
-msgstr ""
-
-#. type: Title #
-#, no-wrap
-msgid "Latest"
-msgstr ""
-"Récent\n"
-"(basculer vers l'anglais pour tout mon contenu)"
-
-#. type: Plain text
-#, no-wrap
-msgid ""
-"[[!inline pages=\"\n"
-"(\n"
-" page(guides/*)\n"
-" or tagged(guide)\n"
-")\n"
-"and !guides/*/*\n"
-"and !guides/*fr*\n"
-"and !tagged(draft)\n"
-"and !tagged(redirection)\"\n"
-"archive=yes\n"
-"title=\"Ayakael - Guides\"\n"
-"description=\"For those who wish to follow my attempt at documentation\"\n"
-"feedshow=\"10\"\n"
-"actions=yes\n"
-"trail=yes\n"
-"]]\n"
-msgstr ""
-"[[!inline pages=\"\n"
-"(\n"
-" page(guides/*fr*)\n"
-" or tagged(guide)\n"
-")\n"
-"and !guides/*/*\n"
-"and !tagged(draft)\n"
-"and !tagged(redirection)\"\n"
-"archive=yes\n"
-"title=\"Ayakael - Guides\"\n"
-"description=\"Pour ceux et celles qui veulent suivre mes tentatives à documenter\"\n"
-"feedshow=\"10\"\n"
-"actions=yes\n"
-"trail=yes\n"
-"]]\n"
diff --git a/guides.mdwn b/guides.mdwn
deleted file mode 100644
index 377404a..0000000
--- a/guides.mdwn
+++ /dev/null
@@ -1,21 +0,0 @@
-[[!meta title="Guides"]]
-
-# Latest
-
-[[!inline pages="
-(
- page(guides/*)
- or tagged(guide)
-)
-and !guides/*/*
-and !guides/*fr*
-and !tagged(draft)
-and !tagged(redirection)"
-archive=yes
-title="Ayakael - Guides"
-description="For those who wish to follow my attempt at documentation"
-feedshow="10"
-actions=yes
-trail=yes
-]]
-
diff --git a/guides.pot b/guides.pot
deleted file mode 100644
index 60fd743..0000000
--- a/guides.pot
+++ /dev/null
@@ -1,48 +0,0 @@
-# SOME DESCRIPTIVE TITLE
-# Copyright (C) YEAR Free Software Foundation, Inc.
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR , YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2026-01-03 13:58-0500\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME \n"
-"Language-Team: LANGUAGE \n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#. type: Plain text
-#, markdown-text, no-wrap
-msgid "[[!meta title=\"Guides\"]]\n"
-msgstr ""
-
-#. type: Title #
-#, markdown-text, no-wrap
-msgid "Latest"
-msgstr ""
-
-#. type: Plain text
-#, markdown-text, no-wrap
-msgid ""
-"[[!inline pages=\"\n"
-"(\n"
-" page(guides/*)\n"
-" or tagged(guide)\n"
-")\n"
-"and !guides/*/*\n"
-"and !guides/*fr*\n"
-"and !tagged(draft)\n"
-"and !tagged(redirection)\"\n"
-"archive=yes\n"
-"title=\"Ayakael - Guides\"\n"
-"description=\"For those who wish to follow my attempt at documentation\"\n"
-"feedshow=\"10\"\n"
-"actions=yes\n"
-"trail=yes\n"
-"]]\n"
-msgstr ""
diff --git a/guides/davinci-resolve.mdwn b/guides/davinci-resolve.mdwn
deleted file mode 100644
index 543ca83..0000000
--- a/guides/davinci-resolve.mdwn
+++ /dev/null
@@ -1,143 +0,0 @@
-[[!meta title="Davinci Resolve Workstation"]]
-
-# Davinci Resolve Workstation
-
-
-
-I do my editing on Davinci Resolve. Since I am trying to get editing and gaming
-off of Windows, I created a Davinci Resolve workstation that is based on Rocky
-Linux 8, the OS Davinci officially supports. While Davinci can be installed on
-other distros, it doesn't work on my [[distro of choice|alpine linux]], thus
-might as well create a dedicated VM for it. Since my [[workstation]] uses
-Proxmox, I can easily use different distros.
-
-This guide thus documents my installation process.
-
-## 1) Install Rocky Linux 8.6
-
-You can download the [BlackMagic's
-ISO](https://downloads.blackmagicdesign.com/DaVinciResolve/DaVinci-Resolve-Linux-RockyLinux_8.6.iso)
-for easier installation
-
-* Upgrade to latest packages
-```
-sudo dnf update
-```
-* Enable networking
-
-By default, wired networking is not automatically turned on.
-
-## 2) Install `amdgpu-pro`
-
-* Remove `nomodeset` and `rdblacklist=nouveau` in grub config in
-`/etc/default/grub` and `/boot/grub2/grubenv`
-
-```
-sudo dnf install http://repo.radeon.com/amdgpu-install/6.3/rhel/8.10/amdgpu-install-6.3.60300-1.el8.noarch.rpm
-sudo amdgpu-install --usecase=workstation --vulkan=pro --opencl=rocr
-```
-
-* Add user to `video` and `render` group:
-```
-sudo usermod -a -G render
-sudo usermod -a -G video
-```
-
-## 3) Install Davince Resolve Studio 19
-
-* Install `xcb-util-cursor`:
-```
-sudo dnf install epel-release
-sudo dnf install xcb-util-cursor
-```
-
-* Download Davinci Resolve Studio 19 by going to [support
-center](https://www.blackmagicdesign.com/support/family/davinci-resolve-and-fusion),
-clicking the desired version, and finally `Downlod only`
-* Extract and run the installer
-* Apply crack (confirmed working with version 19.1.2)
-```
-sudo perl -pi -e 's/\x00\x85\xc0\x74\x7b\xe8/\x00\x85\xc0\xEB\x7b\xe8/g' /opt/resolve/bin/resolve
-```
-
-## 4) Install `awesome` window manager
-
-I only care for tiling window managers. Unfortunately, my manager of choice
-`awesome` is not available on Rocky Linux 8. I thus have to compile it myself,
-which involces compiling its build dependencies.
-
-Compiling awesome on Rocky Linux 8.10 requires the following dependencies (in order of build):
-
-* lua
-* lua-markdown
-* lua-lgi
-* lua-filesystem
-* lua-ldoc
-* lua-penlight
-* xapian-xire
-* doxygen (note: this ought to be fc29 version)
-* libxdg-basedir
-* xcb-util
-* xcb-util-wm
-* xcb-util-keysymx
-* xorg-x11-util-macros
-* xcb-util-xrm
-* libxkb
-* xcb-util-image
-* xcb-util-renderutil
-
-To build these, you have to go through various iterations of fetching
-source RPMs from [fedora 28 src repo](https://archive.fedoraproject.org/pub/archive/fedora/linux/releases/28/Everything/source/tree/Packages),
-installing the builddeps and finally rebuilding using `rpbbuild`. Thus,
-for lua, you would:
-```
-wget https://archive.fedoraproject.org/pub/archive/fedora/linux/releases/28/Everything/source/tree/Packages/l/lua-5.3.4-10.fc28.src.rpm
-sudo dnf builddep lua-*.src.rpm --nobest --refresh
-rpmbuild --rebuild lua-.src.rpm
-```
-
-To facilitate installing the built dependencies, you can use `createrepo` to
-create a repo in `/home/user/rpmbuild` and pointing a new dnf repo to this
-folder.
-
-Specific notes:
-
-* doxygen src rpm should come Fedora 29
-* lua-ldoc and lua-penlight depend on each other, thus you will need to
-temporarily activate the fc28 repo by adding this in
-`/etc/yum.repos.d/fedora.repo`
-```
-[fedora]
-name=Fedora 28 - x86_64
-metalink=https://mirrors.fedoraproject.org/metalink?repo=fedora-28&arch=x86_64
-enabled=1
-gpgcheck=0
-```
-Make sure to disable it after getting lua-ldoc or lua-penlight built.
-
-After building all of your dependencies, clean-up everything by rolling back to
-the transaction before you started installing build dependencies. Use `dnf
-history info ` to find that number and then `dnf history
-rollback `
-
-Once everything is rolledback, you can install awesome and *just* it's runtime
-dependencies, and then refer to archlinux's
-[awesome-gnome](https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=awesome-gnome)
-package or the [wiki article it is based
-on](http://web.archive.org/web/20160205182002/http://awesome.naquadah.org/wiki/Quickly_Setting_up_Awesome_with_Gnome)
-to integrate awesome in gnome.
-
-## 5) Install git-annex standalone
-
-I use git-annex to store my footage. Indeed, there isn't a git-annex package, but it is easy to install git-annex
-standalone by following [upstream's guide](https://git-annex.branchable.com/install/rpm_standalone/)
-
-## Other options
-
-I mentionned above that there were other ways to install Davinci on Linux
-without having to use Rocky Linux. Here are a few:
-
-* [via distrobox](https://github.com/zelikos/davincibox)
-* [on debian](https://github.com/flolu/davinci-resolve-linux)
-* [on arch](https://wiki.archlinux.org/title/DaVinci_Resolve)
-* [on fedora](https://github.com/H3rz3n/How-install-DaVinci-Resolve-in-Fedora-Linux)
diff --git a/guides/davinci-resolve/index.html b/guides/davinci-resolve/index.html
new file mode 100644
index 0000000..0a5e4d5
--- /dev/null
+++ b/guides/davinci-resolve/index.html
@@ -0,0 +1,272 @@
+
+
+
+
+
+
+
+
+
+
+ Davinci Resolve Workstation - Ayakael
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Davinci Resolve Workstation
+
+
I do my editing on Davinci Resolve. Since I am trying to get editing
+and gaming off of Windows, I created a Davinci Resolve workstation that
+is based on Rocky Linux 8, the OS Davinci officially supports. While
+Davinci can be installed on other distros, it doesn’t work on my distro of choice, thus might as well create a
+dedicated VM for it. Since my workstation uses Proxmox, I can easily use
+different distros.
+
This guide thus documents my installation process.
I only care for tiling window managers. Unfortunately, my manager of
+choice awesome is not available on Rocky Linux 8. I thus
+have to compile it myself, which involces compiling its build
+dependencies.
+
Compiling awesome on Rocky Linux 8.10 requires the following
+dependencies (in order of build):
+
+
lua
+
lua-markdown
+
lua-lgi
+
lua-filesystem
+
lua-ldoc
+
lua-penlight
+
xapian-xire
+
doxygen (note: this ought to be fc29 version)
+
libxdg-basedir
+
xcb-util
+
xcb-util-wm
+
xcb-util-keysymx
+
xorg-x11-util-macros
+
xcb-util-xrm
+
libxkb
+
xcb-util-image
+
xcb-util-renderutil
+
+
To build these, you have to go through various iterations of fetching
+source RPMs from fedora
+28 src repo, installing the builddeps and finally rebuilding using
+rpbbuild. Thus, for lua, you would:
To facilitate installing the built dependencies, you can use
+createrepo to create a repo in
+/home/user/rpmbuild and pointing a new dnf repo to this
+folder.
+
Specific notes:
+
+
doxygen src rpm should come Fedora 29
+
lua-ldoc and lua-penlight depend on each other, thus you will need
+to temporarily activate the fc28 repo by adding this in
+/etc/yum.repos.d/fedora.repo
Make sure to disable it after getting lua-ldoc or lua-penlight
+built.
+
After building all of your dependencies, clean-up everything by
+rolling back to the transaction before you started installing build
+dependencies. Use dnf history info <transaction no>
+to find that number and then
+dnf history rollback <transaction no>
+
Once everything is rolledback, you can install awesome and
+just it’s runtime dependencies, and then refer to archlinux’s
+awesome-gnome
+package or the wiki
+article it is based on to integrate awesome in gnome.
+
5) Install git-annex
+standalone
+
I use git-annex to store my footage. Indeed, there isn’t a git-annex
+package, but it is easy to install git-annex standalone by following upstream’s
+guide
+
Other options
+
I mentionned above that there were other ways to install Davinci on
+Linux without having to use Rocky Linux. Here are a few:
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/guides/gaming-vm-on-qubes-using-bazzite.mdwn b/guides/gaming-vm-on-qubes-using-bazzite.mdwn
deleted file mode 100644
index 2d9b684..0000000
--- a/guides/gaming-vm-on-qubes-using-bazzite.mdwn
+++ /dev/null
@@ -1,177 +0,0 @@
-[[!meta title="Gaming VM on Qubes Using Bazzite"]]
-
-# Gaming VM on Qubes Using Bazzite
-
-
-
-My main workstation now uses QubesOS rather than Proxmox. This workstation has two GPUs and two USB controllers. I wanted to be able to assign the more powerful GPU to a Gaming Qubes, but Qubes doesn't support that well. On top of that, the Sapphire Pulse 6700XT GPU that I have has [the AMD reset bug](https://forum.level1techs.com/t/6700xt-reset-bug/181814). To seamlessly be able to shutdown and assign the GPU to another VM (say my video editing environment), I applied a workaround that involved flashing a BIOS from another (working) 6700XT model (the Sapphire Nitro+ 6700XT). This solved the issue, at the cost of having to apply the original romfile on VM start. While this is easy on Proxmox (via `romfile` options), it isn't so easy on Qubes.
-
-I have ressources down at the bottom one can refer to for more information. In any case, lets start the guide.
-
-A note: QubesOS explicitely does not support GPU Passthrough as these devices are notoriously bad at security. I've done my threat modelling, you should do yours to make sure GPU passthrough doesn't expose you. The team is working on [safe GPU acceleration](https://github.com/orgs/QubesOS/projects/17), but it looks like it stalled.
-
-## Setup Bazzite
-
-* Download ISO from https://bazzite.gg/#image-picker (in my case, went with Deck version for big screen mode)
-* Transfer ISO to dom0 (in my case, using ISO from qubes wasn't working). From dom0:
-```shell
-qvm-run -p $vm 'cat /path/to/iso' > bazzite.iso
-```
-* Create standalone VM using Qubes VM manager, setting root drive to 64GB and start VM from dom0 commandline pointing to ISO:
-```shell
-qvm-start --cdrom=dom0:/path/to/iso bazzite
-```
-* In screen, install bazzite with default settings, setting the 64GB image as root. When finished, start to see if everything starts without issue. If all good, shutdown.
-
-## Flash good bios on Sapphire Pulse 6700XT
-
-(this is copy-pasted almost verbatim from a [level1techs.com forum post](https://forum.level1techs.com/t/6700xt-reset-bug/181814/41) by [Mechanical](https://forum.level1techs.com/u/Mechanical))
-
-**I did this for the Sapphire Pulse 6700XT, I make no guarantees this will work on other cards, not even on this card if you have one**
-
-First off you need to check your card’s memory vendor and you need amdvbflash. I used version 4.71.
-You should be able to find your memory vendor by checking GPU-Z in Windows using the stock VBIOS on your current card. Pass it through to your WIndows guest as usual and check GPU-Z for further information.
-
-The memory vendor and chip needs to be one of the following:
-
-* 12288 MB, GDDR6, Hynix H56G42AS8DX014
-* 12288 MB, GDDR6, Micron MT61K512M32C
-* 12288 MB, GDDR6, Samsung K4ZAF325BM
-
-If it isn’t you’re taking a gigantic risk flashing anything.
-
-Next up is dumping the VBIOS. You can also do that through GPU-Z, but I’d do it through Linux as well to ensure the VBIOS is matching. You need to turn off VFIO anyway to flash a VBIOS. Comment out vfio-pci binding the GPU at boot like in /etc/modprobe.d using # and rebuild initramfs using something like mkinitcpio -P and rebooting. The GPU needs to be taken by amdgpu module.
-
-The command for dumping the BIOS using amdvbflash is:
-
-```shell
-./amdvbflash -s 0 MyOriginalVBIOS.rom
-```
-
-You can also just dump it through sysbus:
-
-```shell
-cat /sys/bus/pci/devices/0000:0X:00.0/rom
-```
-
-Where the X is the hexadecimal digit for where your GPU is located. You can find it using lspci -vvv . You probably know yours already.
-Dump multiple version of your VBIOS and ensure their checksum are the same so that you don’t sit there with a corrupted VBIOS backup and put it on another machine/cloud to ensure you have it around.
-
-As everyone points in every guide about these kind of things, but it needs to be said anyway:
-
-**Flashing any VBIOS, especially cross-vendor like this, will 100% destroy your warranty and you might sit there with a brick.**
-
-Use caution and remember it is your own fault if it never boots up ever again. You should have dual-BIOS possibilities on your card to be safer. Single-BIOS is very dangerous. You have been warned.
-So to flash the thing, get the working VBIOS from here: VGA Bios Collection: Sapphire RX 6700 XT 12 GB | TechPowerUp 48
-The MD5 for this should be `bbcf8fd1e226609094cd2283b3ea2259`
-
-Next up you need to flash the thing.
-
-The `-p 0` here means card 0, make sure you’re using the correct card and not your host’s card!!!
-
-```
-./amdvbflash -i # Check that 0 is the card you want to flash first!
-./amdvbflash -fs -fp -fv -p 0 ./249630.rom # This is the actual flashing
-```
-
-That will essentially flash and change the IDs of the card to match the ROM.
-
-You can verify that the ROM was correctly flashed by using:
-
-```
-./amdvbflash -v 0 ./249630.rom
-```
-
-If everything looks ok, shut down the system completely, cold boot and pray things work out. If it boots up in Linux now without any issues you should re-enable the VFIO-PCI module so it binds the card on the next boot. Don’t forget to rebuild initramfs.
-
-Lastly, use your original VBIOS and pass that to the guest. That way the card will use the correct clocks for your card and make it run like it used to.
-
-I would NOT recommend using the Sapphire RX 6700 XT on the host, use your original VBIOS so it runs correctly.
-
-## Setup PCI Passthrough
-
-In my configuration, I pass USB device + GPU + NVMe (containing game files), while also loading the original GPU ROM on the guest. Unlike Proxmox, Qubes does not support this, even though Xen supports setting a custom ROM file. A [creative (read: hacky) solution](https://github.com/QubesOS/qubes-issues/issues/7559#issuecomment-1152944698) by [chriswoope](https://github.com/chriswoope) exists to introduce the romfile, but it involves adding the romfile to the linux stubdomain and making changes to `vchan-socket-proxy` to add the necessary arguments when adding the GPU as a device.
-* Add GPU bios to stubdomain using following script that can be created under `/usr/local/bin/add-gpubios-stubdomain.sh`:
-```bash
-#!/usr/bin/bash
-
-gpubio=$1
-
-for stubdom in /usr/libexec/xen/boot/qemu-stubdom-linux-rootfs /usr/libexec/xen/boot/qemu-stubdom-linux-full-rootfs; do
- dir="$(mktemp -d)"
- cd "$dir"
- if ! test -e "$stubdom.orig"; then
- mv "$stubdom" "$stubdom.orig"
- fi
- zcat "$stubdom.orig"|cpio -idm
- cp -a "${gpubios:=/usr/libexec/xen/boot/gpubios}" ./share/gpubios
- find .|cpio -o -c|gzip -9 > "$stubdom"
-done
-```
-* Rename `vchan-socket-proxy` to `vchan-socket-proxy.orig`:
-```shell
-mv /usr/bin/vchan-socket-proxy /usr/bin/vchan-socket-proxy.orig
-```
-* Install `nmap-ncat`:
-```shell
-qubes-dom0-update nmap-ncat
-```
-* Create wrapper for `vchan-socket-proxy.orig` under `/usr/bin/vchan-socket-proxy`, replacing `0000:07:00:0` with PCI address of device:
-```bash
-#!/usr/bin/bash
-
-vchan-socket-proxy.orig "$1" "$2" "$3" "$4" "$5.internal" &
-ncat -k --listen --unixsock "$5" --sh-exec "sed -u -e 's|\"hostaddr\":\"0000:07:00.0\"|\"hostaddr\":\"0000:07:00.0\",\"romfile\":\"/share/gpubios\"|'|ncat --unixsock $5.internal"
-```
-* Make these two files executable and add gpu bios to stubdomains:
-```shell
-chmod +x /usr/bin/vchan-socket-proxy /usr/local/bin/add-gpubios-stubdomain.sh
-add-gpubios-stubdomain.sh /path/to/rom
-```
-* add devices to qubes:
-```shell
-qvm-pci list
-qvm-pci attach bazzite (address of GPU) --persistent -o no-strict-reset=true -o permissive=true
-qvm-pci attach bazzite (address of GPU audio) --persistent -o no-strict-reset=true -o permissive=true
-qvm-pci attach bazzite (address of USB controller) --persistent -o no-strict-reset=true -o permissive=true
-```
-* disable virtual video mode on qubes, else boot crashes when setting romfile:
-```shell
-qvm-features bazzite video-model none
-```
-* start bazzite qubes, seeing if anything appears on display attached to passthroughed GPU.
-* you can follow `/var/log/xen/console/guest-bazzite-dm.log` to make sure romfile argument has been applied
-
-## Configuring Steam storage and ModOrganizer2.
-
-Since I am using an nvme drive for the game files, I setup this up as a btrfs drive using the included disk manager. In terminal, on Bazzite's desktop, I setup two subvolumes as `steam` and `mods`. The `steam` submodule is mounted using `/etc/fstab` under `/home/bazzite/.local/share/steam` while `mods` is mounted under `/home/bazzite/Mods`. The latter contains mod files used by ModOrganizer2.
-
-ModOrganizer2 can be setup using Furglitch's [modorganiser2-linux-installer](https://github.com/Furglitch/modorganizer2-linux-installer/releases). The following should be noted:
-
-* ModOrganizer does not like being on anywhere that's not under `/home/bazzite` even when setting `STEAM_COMPAT_MOUNTS`. Hence why the NVMe drive is mounted at different locations.
-* Barring that, ModOrganizer should be installed in « Global mode », but mod files can be stored under `~/Mods`
-* `qpaths` is expected in a different location, a symbolic link needed to be created:
-```shell
-sudo ln -s /usr/bin/qtpaths6 /usr/local/bin/qtpaths
-```
-
-## Other notes
-
-* The qubes' home drive isn't in use. Although, maybe it might be a good idea to move the `home` subvolume from root to there. I didn't do that since I didn't know if that would break Bazzite's storage model. If (for some reason) one would want to set Bazzite up as a template (why, who knows), moving to the private subvolume would be necessary
-* My GPU's (already broken) reset mechanism was even more buggy on kernel 6.12. Upgrading to 6.18 did wonders to solve that.
-* My USB controller, based on asm2142, is a bit buggy. It sometimes stops recognizing new devices. I suspect that this is due to the USB hub being USB type A rather than C, so I bought a USB-C 10Gbit hub to make sure it isn't signal degradation.
-
-## Other ressources
-
-* [[1]Qubes OS forums - GPU Passthrough (passthrough works but no monitor recognized, only vDisplay)](https://forum.qubes-os.org/t/gpu-passthrough-passthrough-works-but-no-monitor-recognized-only-vdisplay/31306) Issue that shows different approaches that might work, notably:
-```
-* Edit /etc/default/grub to include rd.qubes.hide_pci, iommu=pt, video=vesafb:off video=efifb:off video=simplefb:off nofb initcall_blacklist=sysfb_init (all the frame buffer stuff is a precaution since I noticed without it I would get text on the monitor connected to the gpu indicating memory being initialized.) See Explaining CSM, efifb=off, and Setting the * Boot GPU Manually - The Passthrough POST for some background on csm vs uefi and how it affects gpu passthrough.
-* Edit /usr/share/qubes/templates/libvirt/devices/pci.xml to pass a techpower rom file (didn’t seem to help). For those who care, I filtered on vm.name and device.libvirt_name=‘pci_0000_05_00_0’.
-* Edit /usr/share/qubes/templates/libvirt/devices/pci.xml to set rom bar=off (didn’t see to help)
-* Edit /usr/share/qubes/templates/libvirt/xen.xml to disable the cpu hypervisor feature (no noticeable affect)
-* Create an sh file to change bar0 to 32GB and bar2 to 8MB. This is apparently necessary for Windows to avoid error 43 for whatever reason. Enabling or disabling rebar in bios does not seem to change behavior (may change performance) [SOLVED] 7900 XTX Code 43 or How to get 7900 XTX to work on VFIO - Virtualization - Level1Techs Forums
-* Create an sh file to remount the gpu (remove and rescan).
-* Attach the GPU with permissive and no-strict-reset. Didn’t seem to change behavior.
-* Enable everything related to virtualization in my motherboard bios (proart x670e-creator)
-* Disable motherboard and cpu ASPM in my motherboard bios. Didn’t seem to change behavior.
-```
diff --git a/guides/gaming-vm-on-qubes-using-bazzite/index.html b/guides/gaming-vm-on-qubes-using-bazzite/index.html
new file mode 100644
index 0000000..18dc958
--- /dev/null
+++ b/guides/gaming-vm-on-qubes-using-bazzite/index.html
@@ -0,0 +1,369 @@
+
+
+
+
+
+
+
+
+
+
+ Gaming VM on Qubes Using Bazzite - Ayakael
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Gaming VM on Qubes Using
+Bazzite
+
+
My main workstation now uses QubesOS rather than Proxmox. This
+workstation has two GPUs and two USB controllers. I wanted to be able to
+assign the more powerful GPU to a Gaming Qubes, but Qubes doesn’t
+support that well. On top of that, the Sapphire Pulse 6700XT GPU that I
+have has the AMD
+reset bug. To seamlessly be able to shutdown and assign the GPU to
+another VM (say my video editing environment), I applied a workaround
+that involved flashing a BIOS from another (working) 6700XT model (the
+Sapphire Nitro+ 6700XT). This solved the issue, at the cost of having to
+apply the original romfile on VM start. While this is easy on Proxmox
+(via romfile options), it isn’t so easy on Qubes.
+
I have ressources down at the bottom one can refer to for more
+information. In any case, lets start the guide.
+
A note: QubesOS explicitely does not support GPU Passthrough as these
+devices are notoriously bad at security. I’ve done my threat modelling,
+you should do yours to make sure GPU passthrough doesn’t expose you. The
+team is working on safe GPU
+acceleration, but it looks like it stalled.
+
Setup Bazzite
+
+
Download ISO from https://bazzite.gg/#image-picker (in my case, went
+with Deck version for big screen mode)
+
Transfer ISO to dom0 (in my case, using ISO from qubes wasn’t
+working). From dom0:
+
+
qvm-run -p $vm 'cat /path/to/iso' > bazzite.iso
+
+
Create standalone VM using Qubes VM manager, setting root drive to
+64GB and start VM from dom0 commandline pointing to ISO:
+
+
qvm-start --cdrom=dom0:/path/to/iso bazzite
+
+
In screen, install bazzite with default settings, setting the 64GB
+image as root. When finished, start to see if everything starts without
+issue. If all good, shutdown.
I did this for the Sapphire Pulse 6700XT, I make no
+guarantees this will work on other cards, not even on this card if you
+have one
+
First off you need to check your card’s memory vendor and you need
+amdvbflash. I used version 4.71. You should be able to find your memory
+vendor by checking GPU-Z in Windows using the stock VBIOS on your
+current card. Pass it through to your WIndows guest as usual and check
+GPU-Z for further information.
+
The memory vendor and chip needs to be one of the following:
+
+
12288 MB, GDDR6, Hynix H56G42AS8DX014
+
12288 MB, GDDR6, Micron MT61K512M32C
+
12288 MB, GDDR6, Samsung K4ZAF325BM
+
+
If it isn’t you’re taking a gigantic risk flashing anything.
+
Next up is dumping the VBIOS. You can also do that through GPU-Z, but
+I’d do it through Linux as well to ensure the VBIOS is matching. You
+need to turn off VFIO anyway to flash a VBIOS. Comment out vfio-pci
+binding the GPU at boot like in /etc/modprobe.d using # and rebuild
+initramfs using something like mkinitcpio -P and rebooting. The GPU
+needs to be taken by amdgpu module.
+
The command for dumping the BIOS using amdvbflash is:
+
./amdvbflash -s 0 MyOriginalVBIOS.rom
+
You can also just dump it through sysbus:
+
cat /sys/bus/pci/devices/0000:0X:00.0/rom
+
Where the X is the hexadecimal digit for where your GPU is located.
+You can find it using lspci -vvv . You probably know yours already. Dump
+multiple version of your VBIOS and ensure their checksum are the same so
+that you don’t sit there with a corrupted VBIOS backup and put it on
+another machine/cloud to ensure you have it around.
+
As everyone points in every guide about these kind of things, but it
+needs to be said anyway:
+
Flashing any VBIOS, especially cross-vendor like this, will
+100% destroy your warranty and you might sit there with a
+brick.
+
Use caution and remember it is your own fault if it never boots up
+ever again. You should have dual-BIOS possibilities on your card to be
+safer. Single-BIOS is very dangerous. You have been warned. So to flash
+the thing, get the working VBIOS from here: VGA Bios Collection:
+Sapphire RX 6700 XT 12 GB | TechPowerUp 48 The MD5 for this should be
+bbcf8fd1e226609094cd2283b3ea2259
+
Next up you need to flash the thing.
+
The -p 0 here means card 0, make sure you’re using the
+correct card and not your host’s card!!!
+
./amdvbflash -i # Check that 0 is the card you want to flash first!
+./amdvbflash -fs -fp -fv -p 0 ./249630.rom # This is the actual flashing
+
That will essentially flash and change the IDs of the card to match
+the ROM.
+
You can verify that the ROM was correctly flashed by using:
+
./amdvbflash -v 0 ./249630.rom
+
If everything looks ok, shut down the system completely, cold boot
+and pray things work out. If it boots up in Linux now without any issues
+you should re-enable the VFIO-PCI module so it binds the card on the
+next boot. Don’t forget to rebuild initramfs.
+
Lastly, use your original VBIOS and pass that to the guest. That way
+the card will use the correct clocks for your card and make it run like
+it used to.
+
I would NOT recommend using the Sapphire RX 6700 XT on the host, use
+your original VBIOS so it runs correctly.
+
Setup PCI Passthrough
+
In my configuration, I pass USB device + GPU + NVMe (containing game
+files), while also loading the original GPU ROM on the guest. Unlike
+Proxmox, Qubes does not support this, even though Xen supports setting a
+custom ROM file. A creative
+(read: hacky) solution by chriswoope exists to introduce
+the romfile, but it involves adding the romfile to the linux stubdomain
+and making changes to vchan-socket-proxy to add the
+necessary arguments when adding the GPU as a device. * Add GPU bios to
+stubdomain using following script that can be created under
+/usr/local/bin/add-gpubios-stubdomain.sh:
qvm-pci list
+qvm-pci attach bazzite (address of GPU) --persistent -o no-strict-reset=true -o permissive=true
+qvm-pci attach bazzite (address of GPU audio) --persistent -o no-strict-reset=true -o permissive=true
+qvm-pci attach bazzite (address of USB controller) --persistent -o no-strict-reset=true -o permissive=true
+
+
disable virtual video mode on qubes, else boot crashes when setting
+romfile:
+
+
qvm-features bazzite video-model none
+
+
start bazzite qubes, seeing if anything appears on display attached
+to passthroughed GPU.
+
you can follow
+/var/log/xen/console/guest-bazzite-dm.log to make sure
+romfile argument has been applied
+
+
Configuring Steam
+storage and ModOrganizer2.
+
Since I am using an nvme drive for the game files, I setup this up as
+a btrfs drive using the included disk manager. In terminal, on Bazzite’s
+desktop, I setup two subvolumes as steam and
+mods. The steam submodule is mounted using
+/etc/fstab under
+/home/bazzite/.local/share/steam while mods is
+mounted under /home/bazzite/Mods. The latter contains mod
+files used by ModOrganizer2.
ModOrganizer does not like being on anywhere that’s not under
+/home/bazzite even when setting
+STEAM_COMPAT_MOUNTS. Hence why the NVMe drive is mounted at
+different locations.
+
Barring that, ModOrganizer should be installed in « Global mode »,
+but mod files can be stored under ~/Mods
+
qpaths is expected in a different location, a symbolic
+link needed to be created:
The qubes’ home drive isn’t in use. Although, maybe it might be a
+good idea to move the home subvolume from root to there. I
+didn’t do that since I didn’t know if that would break Bazzite’s storage
+model. If (for some reason) one would want to set Bazzite up as a
+template (why, who knows), moving to the private subvolume would be
+necessary
+
My GPU’s (already broken) reset mechanism was even more buggy on
+kernel 6.12. Upgrading to 6.18 did wonders to solve that.
+
My USB controller, based on asm2142, is a bit buggy. It sometimes
+stops recognizing new devices. I suspect that this is due to the USB hub
+being USB type A rather than C, so I bought a USB-C 10Gbit hub to make
+sure it isn’t signal degradation.
* Edit /etc/default/grub to include rd.qubes.hide_pci, iommu=pt, video=vesafb:off video=efifb:off video=simplefb:off nofb initcall_blacklist=sysfb_init (all the frame buffer stuff is a precaution since I noticed without it I would get text on the monitor connected to the gpu indicating memory being initialized.) See Explaining CSM, efifb=off, and Setting the * Boot GPU Manually - The Passthrough POST for some background on csm vs uefi and how it affects gpu passthrough.
+* Edit /usr/share/qubes/templates/libvirt/devices/pci.xml to pass a techpower rom file (didn’t seem to help). For those who care, I filtered on vm.name and device.libvirt_name=‘pci_0000_05_00_0’.
+* Edit /usr/share/qubes/templates/libvirt/devices/pci.xml to set rom bar=off (didn’t see to help)
+* Edit /usr/share/qubes/templates/libvirt/xen.xml to disable the cpu hypervisor feature (no noticeable affect)
+* Create an sh file to change bar0 to 32GB and bar2 to 8MB. This is apparently necessary for Windows to avoid error 43 for whatever reason. Enabling or disabling rebar in bios does not seem to change behavior (may change performance) [SOLVED] 7900 XTX Code 43 or How to get 7900 XTX to work on VFIO - Virtualization - Level1Techs Forums
+* Create an sh file to remount the gpu (remove and rescan).
+* Attach the GPU with permissive and no-strict-reset. Didn’t seem to change behavior.
+* Enable everything related to virtualization in my motherboard bios (proart x670e-creator)
+* Disable motherboard and cpu ASPM in my motherboard bios. Didn’t seem to change behavior.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/guides/qubes-os-backups-using-zfs.mdwn b/guides/qubes-os-backups-using-zfs.mdwn
deleted file mode 100644
index 43b878c..0000000
--- a/guides/qubes-os-backups-using-zfs.mdwn
+++ /dev/null
@@ -1,115 +0,0 @@
-[[!meta title="QubesOS backups using ZFS"]]
-
-# QubesOS backups using ZFS
-
-
-
-Rather than use the QubesOS backup solution, I homecooked my own leveraging
-ZFS. Since my disk is encrypted using ZFS, this has the benefit of allowing
-incremental backups while sending encrypted backups to another ZFS pool.
-
-My implementation uses sanoid / syncoid to handle the incremental subvolume
-management. Fortunately, this is packaged in Fedora and simply requires:
-
-```shell
-qubes-dom0-update sanoid
-```
-
-The rest of the workflow is handled by very simple shell scripts.
-
-**SSH tunnel**
-
-Since dom0 is without internet, syncoid needs to send the encrypted dataset
-via an ssh tunnel that goes through `qvm-run`. To facilitate this, under
-`/usr/local/bin/qubes-ssh-proxy`, I have a very simple wrapper script:
-
-```shell
-#!/bin/bash
-CMD="ssh ${@}"
-CMD=$(sed 's$;$\\;$g' <<< ${CMD})
-CMD=$(sed 's$|$\\|$g' <<< ${CMD})
-qvm-run -p $QUBES_SSH_PROXY "${CMD}"
-```
-
-This uses environment variable `QUBES_SSH_PROXY` to set target, wraps the ssh
-command and feeds it into `qvm-run`. Special characters are escaped.
-
-So that syncoid uses the SSH proxy, we have to modify `/usr/sbin/syncoid`:
-```diff
-diff --git a/usr/sbin/syncoid.orig b/usr/sbin/syncoid
-index 956f3e7..484aae4 100755
---- a/usr/sbin/syncoid.orig
-+++ b/usr/sbin/syncoid
-@@ -103,7 +103,7 @@ $ENV{'PATH'} = $ENV{'PATH'} . ":/bin:/usr/bin:/sbin";
-
- my $zfscmd = 'zfs';
- my $zpoolcmd = 'zpool';
--my $sshcmd = 'ssh';
-+my $sshcmd = 'qubes-ssh-proxy';
- my $pscmd = 'ps';
-
- my $pvcmd = 'pv';
-```
-
-Eventually, might be worthwhile to implement an environment variable to feed
-`$sshcmd` in a more elegant way.
-
-**Syncoid wrapper**
-
-Finally, I use a very small script that wraps syncoid, and transfers the subvolumes
-that I want to transfer. I call it `bacoid`, and it lives under `/usr/local/bin`:
-```shell
-#!/bin/bash
-
-USER=(target user)
-MACHINE=(machine name)
-HOST=(target host)
-PORT=(target port)
-POOL=(target pool)
-KEY=(key on dom0 to use)
-KNOWN_HOSTS=(known hosts on dom0 to use)
-
-export QUBES_SSH_PROXY=sys-firewall
-
-if ! qvm-run -p $QUBES_SSH_PROXY "ls /home/user/QubesIncoming/dom0/${KEY##*/}"; then
- echo "copying dom0 key"
- qvm-copy-to-vm $QUBES_SSH_PROXY $KEY
-fi
-
-if ! qvm-run -p $QUBES_SSH_PROXY "ls /home/user/QubesIncoming/dom0/${KNOWN_HOSTS##*/}"; then
- echo "copying dom0 known_hosts"
- qvm-copy-to-vm $QUBES_SSH_PROXY $KNOWN_HOSTS
-fi
-
-subvolArray=(
- (array of subvolumes to transfer)
-)
-
-
-for subvol in ${subvolArray[@]}; do
- syncoid --sendoptions="w" --compress=none --recvoptions="u" -r --sshport=${PORT} --no-privilege-elevation ${subvol} ${USER}@${HOST}:${POOL}/${USER/-/\/}/${MACHINE}/${subvol} --sshkey=/home/user/QubesIncoming/dom0/${KEY##*/}
-done
-```
-
-What this does is use `qubes-ssh-proxy` to tunnel a ZFS send / receive
-operation that targets a remote server. We leverage `--sendoptions="w"` to send
-the ZFS subvolume as raw, thus encrypted. The target machine will not be able
-to read the subvolume.
-
-This wrapper evidently assumes you have a key generated on dom0, and `known_hosts` file
-with the target machines' host. So you have the send the public key to the remote server
-and import the server's fingerprint in dom0. Since I use a disposable VM for `sys-firewall`,
-this is why dom0 key and known hosts file is transferred.
-
-**Security**
-
-It's worth mentionning again that if your dataset is not encrypted, it will be
-readable by the target machine. That said, the transfer is always encrypted
-since it's over SSH. In any case, I send this to a machine that I control, and
-the hosts fingerprint would be different in the event of a man-in-the-middle
-attack.
-
-There are also more sophisticated implementation of this idea. For example,
-another version of bacoid used on my servers leverage ZFS config parameters
-to set target machine, user, etc. Since my needs on my Qubes workstation is
-limited, I kept this KISS.
diff --git a/guides/qubes-os-backups-using-zfs/index.html b/guides/qubes-os-backups-using-zfs/index.html
new file mode 100644
index 0000000..e644aab
--- /dev/null
+++ b/guides/qubes-os-backups-using-zfs/index.html
@@ -0,0 +1,232 @@
+
+
+
+
+
+
+
+
+
+
+ QubesOS backups using ZFS - Ayakael
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
QubesOS backups using ZFS
+
+
Rather than use the QubesOS backup solution, I homecooked my own
+leveraging ZFS. Since my disk is encrypted using ZFS, this has the
+benefit of allowing incremental backups while sending encrypted backups
+to another ZFS pool.
+
My implementation uses sanoid / syncoid to handle the incremental
+subvolume management. Fortunately, this is packaged in Fedora and simply
+requires:
+
qubes-dom0-update sanoid
+
The rest of the workflow is handled by very simple shell scripts.
+
SSH tunnel
+
Since dom0 is without internet, syncoid needs to send the encrypted
+dataset via an ssh tunnel that goes through qvm-run. To
+facilitate this, under /usr/local/bin/qubes-ssh-proxy, I
+have a very simple wrapper script:
Eventually, might be worthwhile to implement an environment variable
+to feed $sshcmd in a more elegant way.
+
Syncoid wrapper
+
Finally, I use a very small script that wraps syncoid, and transfers
+the subvolumes that I want to transfer. I call it bacoid,
+and it lives under /usr/local/bin:
+
#!/bin/bash
+
+USER=(target user)
+MACHINE=(machine name)
+HOST=(target host)
+PORT=(target port)
+POOL=(target pool)
+KEY=(key on dom0 to use)
+KNOWN_HOSTS=(known hosts on dom0 to use)
+
+export QUBES_SSH_PROXY=sys-firewall
+
+if ! qvm-run -p $QUBES_SSH_PROXY "ls /home/user/QubesIncoming/dom0/${KEY##*/}"; then
+ echo "copying dom0 key"
+ qvm-copy-to-vm $QUBES_SSH_PROXY $KEY
+fi
+
+if ! qvm-run -p $QUBES_SSH_PROXY "ls /home/user/QubesIncoming/dom0/${KNOWN_HOSTS##*/}"; then
+ echo "copying dom0 known_hosts"
+ qvm-copy-to-vm $QUBES_SSH_PROXY $KNOWN_HOSTS
+fi
+
+subvolArray=(
+ (array of subvolumes to transfer)
+)
+
+
+for subvol in ${subvolArray[@]}; do
+ syncoid --sendoptions="w" --compress=none --recvoptions="u" -r --sshport=${PORT} --no-privilege-elevation ${subvol} ${USER}@${HOST}:${POOL}/${USER/-/\/}/${MACHINE}/${subvol} --sshkey=/home/user/QubesIncoming/dom0/${KEY##*/}
+done
+
What this does is use qubes-ssh-proxy to tunnel a ZFS
+send / receive operation that targets a remote server. We leverage
+--sendoptions="w" to send the ZFS subvolume as raw, thus
+encrypted. The target machine will not be able to read the
+subvolume.
+
This wrapper evidently assumes you have a key generated on dom0, and
+known_hosts file with the target machines’ host. So you
+have the send the public key to the remote server and import the
+server’s fingerprint in dom0. Since I use a disposable VM for
+sys-firewall, this is why dom0 key and known hosts file is
+transferred.
+
Security
+
It’s worth mentionning again that if your dataset is not encrypted,
+it will be readable by the target machine. That said, the transfer is
+always encrypted since it’s over SSH. In any case, I send this to a
+machine that I control, and the hosts fingerprint would be different in
+the event of a man-in-the-middle attack.
+
There are also more sophisticated implementation of this idea. For
+example, another version of bacoid used on my servers leverage ZFS
+config parameters to set target machine, user, etc. Since my needs on my
+Qubes workstation is limited, I kept this KISS.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/guides/virtualized-hardware-acceleration-qubes-os.mdwn b/guides/virtualized-hardware-acceleration-qubes-os.mdwn
deleted file mode 100644
index dbea805..0000000
--- a/guides/virtualized-hardware-acceleration-qubes-os.mdwn
+++ /dev/null
@@ -1,204 +0,0 @@
-[[!meta title="Virtualized hardware acceleration on QubesOS using Intel Arc B50"]]
-
-# Virtualized hardware acceleration on QubesOS using Intel Arc B50
-
-
-
-## Setting up the Arc Pro B50
-
-### Update the Arc Pro firmware
-
-The Arc Pro B50, out of factory, does not include a firmware that supports
-SR-IOV. We thus have to update it. Unfortunately, it looks like [newer version
-of the firmware artifically limits to VF count to 2](https://community.intel.com/t5/Graphics/Why-did-the-latest-Intel-Arc-ProB50-firmware-nerf-SR-IOV-VFs/td-p/1732703)
-rather than 12, when the feature was first supported. You might want to flash
-to older version, in this case.
-
-Driver overview for the B50:
-
-* Driver 32.0.101.8331 for Intel Arc < max VFs = 2
-* Driver 32.0.101.8306 for Intel Arc Pro < max VFs = 2
-* Driver 32.0.101.6979 for Intel Arc Pro < max VFs = 12
-
-The last driver in the list is still the one to get to have access to all
-Virtual Functions. The easy way to flash the new drivers is by installing, in a
-windows environment, the [Intel Arc Pro Graphic driver](https://www.intel.com/content/www/us/en/download/741626/intel-arc-pro-graphics-windows.html) of the version you desire. Unfortunately, this requires
-running windows on bare-metal to flash safely.
-
-There is a way to update the firmware using `fwupd`, but this guide has not
-documented this way yet on QubesOS.
-
-### Determine the device address
-
-```shell
-$ lspci -vv | grep B50
-06:00.0 VGA compatible controller: Intel Corporation Battlemage G21 [Arc Pro B50] (prog-if 00 [VGA controller])
-```
-
-For the rest of the guide, I will reference the B50 with 0000:06:00.0. Update
-the snippets accordingly.
-
-```shell
-$ lspci -vv -s 06:00.0
-06:00.0 VGA compatible controller: Intel Corporation Battlemage G21 [Arc Pro B50] (prog-if 00 [VGA controller])
- Subsystem: Intel Corporation Device 1114
- Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
- Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR-
- Kernel driver in use: xe
- Kernel modules: xe
-```
-
-If everything went well the last two lines should point to the xe driver.
-
-Query max Virtual Functions
-
-```shell
-$ cat /sys/bus/pci/devices/0000:06:00.0/sriov_totalvfs
-2
-```
-
-## Boot process
-
-### Hardware
-
-Not all hardware will support the SR-IOV use case. The following needs to be
-enabled in BIOS:
-
-* ResizeBar
-* IOMMU / SR-IOV
-* ASPM (optional, but advised by Intel)
-
-In my case, I have a Supermicro X10-based system, which means ResizeBar is not
-supported. To unlock, I thus leveraged [xCurio0's
-ReBarUEFI](https://github.com/xCuri0/ReBARUEFI) to patch in ResizeBar support.
-How to do this is out-of-scope of this guide.
-
-### Kernel
-
-This also requires a newer kernel. At the time of writing this guide, kernel
-6.19 works, but kernel 6.17 theoretically includes SR-IOV support in xe drivers
-
-### Disabling auto probing
-
-There is a currently a bug with Xen, where unbinding `xe` from virtual
-functions after creation leads to a kernel crash. To mitigate this issue, we can
-disable automatic probing by leveraging the `sriov_drivers_autoprobe` sysfs
-parameter:
-
-```shell
-echo 0 | sudo tee /sys/bus/pci/devices/"$DEVICE"/sriov_drivers_autoprobe
-```
-
-This will ensure that the virtual function will be able to attach the device
-when starting the VM.
-
-That said, the following udev rule can be created to do this automatically:
-
-```udev
-ACTION="add", SUBSYSTEM="pci", ATTR{sriov_totalvfs}=="*", ATTR{sriov_drivers_autoprobe}="0"
-```
-
-### Enable virtual function creation
-
-Due to how the driver works, when the virtual functions are created, whatever
-VRAM is not currently in use will be split up between the functions. Thus, to
-keep some VRAM for the host, we have to allocate some memory, before creating
-the VFs. There isn'tan elegant way to do so, so this guide proposes the use of
-[vramfs](https://github.com/Overv/vramfs) to pre-allocate VRAM for the host,
-then drop the vram filesystem after creation of the virtual functions.
-
-Unfortunately, `vramfs` is not packaged in Fedora, so it is provided by myself
-via my [qubes-pkgs](https://ayakael.net/forge/qubes-pkgs) repo, and installable
-through dnf using [this
-package](https://ayakael.net/forge/-/packages/rpm/vramfs).
-
-To facilitate setting up the virtual functions, I took [vitabis'
-script](https://forum.level1techs.com/t/virtualization-workstation-with-the-intel-arc-pro-b50/243577)
-and wrapped it in a udev rule. So, on dom0, you can create the following file
-under `/usr/local/bin/spawn_xe_vfs.sh`:
-
-```shell
-#!/bin/bash
-
-###################################################################
-# Helper script to automate the initialization of Virtual Functions
-# The idea is to quickly allocate memory space on the Arc Pro GPU,
-# before the Virtual Functions are created. After VF creation,
-# this memory is released and will remain available to the PF.
-###################################################################
-
-### VARIABLES FOR USER TO SET (REQUIRED)
-# The Physical Function's address (eg from lspci, domain:bus:device.function)
-DEVICE="$1"
-# Number of Virtual Functions to create
-NUM_VFS="$2"
-
-### VARIABLES FOR USER TO OVERRIDE (OPTIONAL)
-# Amount of memory that will remain available to the Physical Function after
-# Virtual Functions have been created (in KB/MB/GB).
-VRAMFS_SIZE="$3"
-# Entry path into the vramfs filesystem
-VRAMFS_PATH="/tmp/vram"
-# Delay until the vramfs filesystem is mounted (in seconds)
-DELAY_VFS=3
-
-# Create vramfs storage of requested size.
-if [ ! -e "$VRAMFS_PATH" ]; then
- /usr/bin/mkdir $VRAMFS_PATH
-fi
-/usr/bin/vramfs $VRAMFS_PATH $VRAMFS_SIZE &
-
-# Wait for the filesystem to mount (in the background) before spawning VFs
-sleep $DELAY_VFS
-
-# Create Virtual Functions
-echo "creating vfs."
-/usr/bin/echo $NUM_VFS > "/sys/bus/pci/devices/"$DEVICE"/sriov_numvfs"
-
-# Tear down the vramfs filesystem
-echo "terminating vramfs."
-```
-
-Make it executable:
-
-```shell
-chmod +x /usr/local/bin/spawn_xe_vfs.sh
-```
-
-Finally, create the udev rule under
-`/etc/udev/rules.d/81-enable-sriov-numvfs.rules`:
-
-```udev
-ACTION="add", SUBSYSTEM=="pci", ATTR{subsystem_device}=="0x1114", ATTR{subsystem_vendor}=="0x8086", RUN+="/usr/local/bin/spawn_xe_vfs.sh %k 2 1GB"
-```
-
-This rule, when adding the Intel Arc B50, executes `spawn_xe_vfs.sh` and feeds
-the device address, tells the script to create 2 virtual functions, while
-pre-allocating 1GB of VRAM to the host. You can adjust these arguments
-depending on your needs, and which firmware you used.
-
-## Assign VF to VM
-
-After this, you should be able to assign the virtual functions to the VM like
-any other PCI device. You should use, at least, the kernel version used in
-dom0. The VM should also be an HVM, like any other VM you attach devices to.
-
-## References
-
-* [Vitabis' guide on virtualization workstation with the Inter Arc Pro B50](https://forum.level1techs.com/t/virtualization-workstation-with-the-intel-arc-pro-b50/243577)
-* [Level1Tech forums thread on the Intel Arc Pro B50 and SR-IOV support with many many comments](https://forum.level1techs.com/t/intel-arc-pro-b50-sr-iov-and-me/236473)
-* [QubesOS forum thread on using SR-IOV in QubesOS contact](https://forum.qubes-os.org/t/virtualised-intel-gpu-with-sr-iov/40649/35)
-
-
-## Known issues
-
-* Fans can sometimes get stuck at 100% when there is no monitor connected. Workaround is to plug a headless displayport adapter. ([read more](https://www.linkedin.com/pulse/running-docker-swarm-cluster-intel-arc-pro-b50-sascha-siekmann-wcwqc#:~:text=Well%2C%20after%2020%20minutes%20the,advice:%20never%20throw%20anything%20away.))
-* Using the Intel Arc B50 as dom0's GPU is problematic. After a while, artifacts appear (flickering black bars, black boxes). This seems to be a bug with Xen when dom0 is in PV mode ([qubes os ticket](https://github.com/QubesOS/qubes-issues/issues/10661), [upstream report](https://lore.kernel.org/xen-devel/aYtznP_tT6xNPwf-@mail-itl/T/#u)). My workaround is to use a different GPU for dom0, which defeats the purpose of pre-allocating VRAM, but alas... hopefully this is fixed soon. (update 2026/05/20 - since update to linux 7.0, these artifacts happen a lot less frequently)
-* Quite often, VM hangs for a moment, and kernel log shows: `xe 0000:00:08.0: [drm] *ERROR* TLB invalidation fence timeout, seqno=287 recv=286`. Still investigating a workaround. (seems to be related to [gitlab.freedesktop.org/drm/i915#14469](https://gitlab.freedesktop.org/drm/i915/kernel/-/work_items/14469#note_3170015) and [gh/strongtz/i915-sriov-dkms#332](https://github.com/strongtz/i915-sriov-dkms/issues/332))
diff --git a/guides/virtualized-hardware-acceleration-qubes-os/index.html b/guides/virtualized-hardware-acceleration-qubes-os/index.html
new file mode 100644
index 0000000..78c1b6f
--- /dev/null
+++ b/guides/virtualized-hardware-acceleration-qubes-os/index.html
@@ -0,0 +1,326 @@
+
+
+
+
+
+
+
+
+
+
+ Virtualized hardware acceleration on QubesOS using Intel Arc B50 - Ayakael
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Virtualized
+hardware acceleration on QubesOS using Intel Arc B50
+
+
Setting up the Arc Pro B50
+
Update the Arc Pro firmware
+
The Arc Pro B50, out of factory, does not include a firmware that
+supports SR-IOV. We thus have to update it. Unfortunately, it looks like
+newer
+version of the firmware artifically limits to VF count to 2 rather
+than 12, when the feature was first supported. You might want to flash
+to older version, in this case.
+
Driver overview for the B50:
+
+
Driver 32.0.101.8331 for Intel Arc < max VFs = 2
+
Driver 32.0.101.8306 for Intel Arc Pro < max VFs = 2
+
Driver 32.0.101.6979 for Intel Arc Pro < max VFs = 12
+
+
The last driver in the list is still the one to get to have access to
+all Virtual Functions. The easy way to flash the new drivers is by
+installing, in a windows environment, the Intel
+Arc Pro Graphic driver of the version you desire. Unfortunately,
+this requires running windows on bare-metal to flash safely.
+
There is a way to update the firmware using fwupd, but
+this guide has not documented this way yet on QubesOS.
Not all hardware will support the SR-IOV use case. The following
+needs to be enabled in BIOS:
+
+
ResizeBar
+
IOMMU / SR-IOV
+
ASPM (optional, but advised by Intel)
+
+
In my case, I have a Supermicro X10-based system, which means
+ResizeBar is not supported. To unlock, I thus leveraged xCurio0’s ReBarUEFI to
+patch in ResizeBar support. How to do this is out-of-scope of this
+guide.
+
Kernel
+
This also requires a newer kernel. At the time of writing this guide,
+kernel 6.19 works, but kernel 6.17 theoretically includes SR-IOV support
+in xe drivers
+
Disabling auto probing
+
There is a currently a bug with Xen, where unbinding xe
+from virtual functions after creation leads to a kernel crash. To
+mitigate this issue, we can disable automatic probing by leveraging the
+sriov_drivers_autoprobe sysfs parameter:
+
echo 0 | sudo tee /sys/bus/pci/devices/"$DEVICE"/sriov_drivers_autoprobe
+
This will ensure that the virtual function will be able to attach the
+device when starting the VM.
+
That said, the following udev rule can be created to do this
+automatically:
Due to how the driver works, when the virtual functions are created,
+whatever VRAM is not currently in use will be split up between the
+functions. Thus, to keep some VRAM for the host, we have to allocate
+some memory, before creating the VFs. There isn’tan elegant way to do
+so, so this guide proposes the use of vramfs to pre-allocate VRAM
+for the host, then drop the vram filesystem after creation of the
+virtual functions.
+
Unfortunately, vramfs is not packaged in Fedora, so it
+is provided by myself via my qubes-pkgs repo, and
+installable through dnf using this
+package.
+
To facilitate setting up the virtual functions, I took vitabis’
+script and wrapped it in a udev rule. So, on dom0, you can create
+the following file under
+/usr/local/bin/spawn_xe_vfs.sh:
+
#!/bin/bash
+
+###################################################################
+# Helper script to automate the initialization of Virtual Functions
+# The idea is to quickly allocate memory space on the Arc Pro GPU,
+# before the Virtual Functions are created. After VF creation,
+# this memory is released and will remain available to the PF.
+###################################################################
+
+### VARIABLES FOR USER TO SET (REQUIRED)
+# The Physical Function's address (eg from lspci, domain:bus:device.function)
+DEVICE="$1"
+# Number of Virtual Functions to create
+NUM_VFS="$2"
+
+### VARIABLES FOR USER TO OVERRIDE (OPTIONAL)
+# Amount of memory that will remain available to the Physical Function after
+# Virtual Functions have been created (in KB/MB/GB).
+VRAMFS_SIZE="$3"
+# Entry path into the vramfs filesystem
+VRAMFS_PATH="/tmp/vram"
+# Delay until the vramfs filesystem is mounted (in seconds)
+DELAY_VFS=3
+
+# Create vramfs storage of requested size.
+if [ ! -e "$VRAMFS_PATH" ]; then
+ /usr/bin/mkdir $VRAMFS_PATH
+fi
+/usr/bin/vramfs $VRAMFS_PATH $VRAMFS_SIZE &
+
+# Wait for the filesystem to mount (in the background) before spawning VFs
+sleep $DELAY_VFS
+
+# Create Virtual Functions
+echo "creating vfs."
+/usr/bin/echo $NUM_VFS > "/sys/bus/pci/devices/"$DEVICE"/sriov_numvfs"
+
+# Tear down the vramfs filesystem
+echo "terminating vramfs."
+
Make it executable:
+
chmod +x /usr/local/bin/spawn_xe_vfs.sh
+
Finally, create the udev rule under
+/etc/udev/rules.d/81-enable-sriov-numvfs.rules:
This rule, when adding the Intel Arc B50, executes
+spawn_xe_vfs.sh and feeds the device address, tells the
+script to create 2 virtual functions, while pre-allocating 1GB of VRAM
+to the host. You can adjust these arguments depending on your needs, and
+which firmware you used.
+
Assign VF to VM
+
After this, you should be able to assign the virtual functions to the
+VM like any other PCI device. You should use, at least, the kernel
+version used in dom0. The VM should also be an HVM, like any other VM
+you attach devices to.
Fans can sometimes get stuck at 100% when there is no monitor
+connected. Workaround is to plug a headless displayport adapter. (read
+more)
+
Using the Intel Arc B50 as dom0’s GPU is problematic. After a while,
+artifacts appear (flickering black bars, black boxes). This seems to be
+a bug with Xen when dom0 is in PV mode (qubes os
+ticket, upstream
+report). My workaround is to use a different GPU for dom0, which
+defeats the purpose of pre-allocating VRAM, but alas… hopefully this is
+fixed soon. (update 2026/05/20 - since update to linux 7.0, these
+artifacts happen a lot less frequently)
+
Quite often, VM hangs for a moment, and kernel log shows:
+xe 0000:00:08.0: [drm] *ERROR* TLB invalidation fence timeout, seqno=287 recv=286.
+Still investigating a workaround. (seems to be related to gitlab.freedesktop.org/drm/i915#14469
+and gh/strongtz/i915-sriov-dkms#332)
+ # Traduction de ikiwiki
+# Copyright (C) 2009 Debian French l10n team
+# This file is distributed under the same license as the PACKAGE Ikiwiki.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ikiwiki\n"
+"POT-Creation-Date: 2009-08-15 18:30-0300\n"
+"PO-Revision-Date: 2009-08-25 11:25+0200\n"
+"Last-Translator: Philippe Batailler \n"
+"Language-Team: French \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bits\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "\n"
+msgstr "\n"
+
+#. type: Plain text
+msgid ""
+"Directives are similar to a WikiLink in form, except they begin "
+"with `!` and may contain parameters. The general form is:"
+msgstr ""
+"Les directives sont semblables aux WikiLink mais elles "
+"commencent par un `!` et peuvent contenir des paramètres. La forme d'une "
+"directive est la suivante :"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\[[!directive param=\"value\" param=\"value\"]]\n"
+msgstr "\t\[[!directive param=\"value\" param=\"value\"]]\n"
+
+#. type: Plain text
+msgid ""
+"This gets expanded before the rest of the page is processed, and can be used "
+"to transform the page in various ways."
+msgstr ""
+"Le contenu de cette directive est traité avant que la page ne soit traitée "
+"et cela peut être utilisé pour modifier cette page."
+
+#. type: Plain text
+msgid ""
+"The quotes around values can be omitted if the value is a simple word. "
+"Also, some directives may use parameters without values, for example:"
+msgstr ""
+"Les guillements autour des valeurs des paramètres peuvent être omis si cette "
+"valeur est un simple mot. D'autre part, certaines directives peuvent avoir "
+"des paramètres sans valeur, par exemple : "
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\[[!tag foo]]\n"
+msgstr "\t\[[!tag foo]]\n"
+
+#. type: Plain text
+msgid ""
+"A directive does not need to all be on one line, it can be wrapped to "
+"multiple lines if you like:"
+msgstr ""
+"Il n'est pas nécessaire d'écrire une directive sur une seule ligne ; elle "
+"peut l'être sur plusieurs si vous préférez. Par exemple :"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t\[[!directive foo=\"baldersnatch\"\n"
+"\tbar=\"supercalifragilisticexpialidocious\" baz=11]]\n"
+msgstr ""
+"\t\[[!directive foo=\"baldersnatch\"\n"
+"\tbar=\"supercalifragilisticexpialidocious\" baz=11]]\n"
+
+#. type: Plain text
+msgid ""
+"Also, multiple lines of *quoted* text can be used for a value. To allow "
+"quote marks inside the quoted text, delimit the block of text with triple-"
+"quotes:"
+msgstr ""
+"De plus, une *citation* sur plusieurs lignes peut servir de valeur. Pour "
+"autoriser les guillemets du texte, il suffit de mettre trois séries de "
+"guillemets autour du texte :"
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\[[!directive text=\"\"\"\n"
+msgstr "\t\\[[!directive text=\"\"\"\n"
+
+#. type: Bullet: ' 1. '
+msgid "\"foo\""
+msgstr "\"foo\""
+
+#. type: Bullet: ' 2. '
+msgid "\"bar\""
+msgstr "\"bar\""
+
+#. type: Bullet: ' 3. '
+msgid "\"baz\""
+msgstr "\"baz\""
+
+#. type: Plain text
+msgid ""
+"ikiwiki also has an older syntax for directives, which requires a space in "
+"directives to distinguish them from wikilinks. This "
+"syntax has several disadvantages: it requires a space after directives with "
+"no parameters (such as `\[[pagecount ]]`), and it prohibits spaces in "
+"wikilinks. ikiwiki now provides the `!`-prefixed "
+"syntax shown above as default. However, ikiwiki still supports wikis using "
+"the older syntax, if the `prefix_directives` option is disabled."
+msgstr ""
+"Il existe aussi une ancienne syntaxe pour les directives. Elle demande un "
+"espace dans la directive pour les distinguer des [[wikilinks|ikiwiki/"
+"wikilink]]. Cette syntaxe a plusieurs défauts : elle demande un espace après "
+"une directive sans paramètre, comme `\[[pagecount ]]`, et elle interdit les "
+"espaces dans les wikilinks. Par défaut, ikiwiki utilise "
+"maintenant la syntaxe montrée plus haut, avec le `!`. Cependant, l'ancienne "
+"syntaxe est toujours acceptée, une fois que l'option `prefix_directives` est "
+"désactivée."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!if Error: syntax error in pagespec "\"enabled(listdirectives)\""]]\n"
+msgstr "[[!listdirectives ]]\n"
+
+
+
+
+
+
+
+
+
+
+
+
+
Also, multiple lines of quoted text can be used for a value.
+To allow quote marks inside the quoted text, delimit the block of text
+with triple-double-quotes or triple-single-quotes:
If you want to put text with triple quotes into a parameter value,
+you can use perl-style here-doc syntax, even nesting it like this:
+
[[!directive text=<<OUTER
+[[!otherdirective <<INNER
+inner text
+INNER]]
+outer text
+OUTER]]
+
ikiwiki also has an older syntax for directives, which requires a
+space in directives to distinguish them from
+wikilinks. This syntax has several
+disadvantages: it requires a space after directives with no parameters
+(such as [[pagecount ]]), and it prohibits spaces in
+wikilinks. ikiwiki now provides the
+!-prefixed syntax shown above as default. However, ikiwiki
+still supports wikis using the older syntax, if the
+prefix_directives option is disabled.
+
Here is a list of currently available directives in this wiki:
+ # Traduction de ikiwiki
+# Copyright (C) 2009 Debian French l10n team
+# This file is distributed under the same license as the PACKAGE Ikiwiki.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ikiwiki\n"
+"POT-Creation-Date: 2009-08-26 13:39-0300\n"
+"PO-Revision-Date: 2009-08-26 21:18+0200\n"
+"Last-Translator: Philippe Batailler \n"
+"Language-Team: French \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bits\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "\n"
+msgstr "\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "\n"
+msgstr "\n"
+
+#. type: Plain text
+msgid ""
+"Text on this wiki is, by default, written in a form very close to how you "
+"might write text for an email message. This style of text formatting is "
+"called MarkDown, and it works like this:"
+msgstr ""
+"Sur ce wiki, la mise en forme du texte est semblable à celle utilisée dans "
+"les courriels. Ce style de formatage s'appelle MarkDown. Voici comment "
+"il fonctionne :"
+
+#. type: Plain text
+msgid "Leave blank lines between paragraphs."
+msgstr "Lignes vides entre les paragraphes."
+
+#. type: Plain text
+msgid ""
+"You can *\\*emphasise\\** or **\\*\\*strongly emphasise\\*\\*** text by "
+"placing it in single or double asterisks."
+msgstr ""
+"Texte en *\\*italique\\** avec un astérisque ou texte en **\\*\\*gras\\*"
+"\\*** avec deux astérisques."
+
+#. type: Plain text
+msgid "To create a list, start each line with an asterisk:"
+msgstr "Une liste, chaque ligne commençant par un astérisque :"
+
+#. type: Bullet: '* '
+msgid "\"* this is my list\""
+msgstr "\"* ma liste\""
+
+#. type: Bullet: '* '
+msgid "\"* another item\""
+msgstr "\"* un autre élément\""
+
+#. type: Plain text
+msgid ""
+"To make a numbered list, start each line with a number (any number will do) "
+"followed by a period:"
+msgstr ""
+"Une liste numérotée, chaque ligne commençant par un chiffre (n'importe "
+"lequel), suivi d'un point :"
+
+#. type: Bullet: '1. '
+msgid "\"1. first line\""
+msgstr "\"1. première ligne\""
+
+#. type: Bullet: '2. '
+msgid "\"2. second line\""
+msgstr "\"2. deuxième ligne\""
+
+#. type: Bullet: '2. '
+msgid "\"2. third line\""
+msgstr "\"2. troisième ligne\""
+
+#. type: Plain text
+msgid ""
+"To create a header, start a line with one or more `#` characters followed by "
+"a space and the header text. The number of `#` characters controls the size "
+"of the header:"
+msgstr ""
+"Un titre, une ligne commençant par un ou plusieurs caractères `#` suivis "
+"d'un caractère espace et du texte du titre. Le nombre de `#` détermine la "
+"taille du titre :"
+
+#. type: Title #
+#, no-wrap
+msgid "# h1"
+msgstr "# h1"
+
+#. type: Title ##
+#, no-wrap
+msgid "## h2"
+msgstr "## h2"
+
+#. type: Title ###
+#, no-wrap
+msgid "### h3"
+msgstr "### h3"
+
+#. type: Title ####
+#, no-wrap
+msgid "#### h4"
+msgstr "#### h4"
+
+#. type: Title #####
+#, no-wrap
+msgid "##### h5"
+msgstr "##### h5"
+
+#. type: Title ######
+#, no-wrap
+msgid "###### h6"
+msgstr "###### h6"
+
+#. type: Plain text
+msgid ""
+"To create a horizontal rule, just write three or more dashes or stars on "
+"their own line:"
+msgstr ""
+"Une règle horizontale, au moins trois tirets ou étoiles sur la même ligne :"
+
+#. type: Plain text
+#, no-wrap
+msgid "To quote someone, prefix the quote with \">\":\n"
+msgstr "Pour citer quelqu'un, faire précéder la citation de \">\" :\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"> To be or not to be,\n"
+"> that is the question.\n"
+msgstr ""
+"> To be or not to be,\n"
+"> that is the question.\n"
+
+#. type: Plain text
+msgid "To write a code block, indent each line with a tab or 4 spaces:"
+msgstr ""
+"Un morceau de code, faire précéder chaque ligne par une tabulation ou quatre "
+"espaces :"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"\t10 PRINT \"Hello, world!\"\n"
+"\t20 GOTO 10\n"
+msgstr ""
+"\t10 PRINT \"Hello, world!\"\n"
+"\t20 GOTO 10\n"
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"To link to an url or email address, you can just put the\n"
+"url in angle brackets: <>, or you can use the\n"
+"form \\[link text\\]\\(url\\)\n"
+msgstr ""
+"Pour créer un lien avec une URL ou une adresse électronique,\n"
+"mettre l'URL entre crochets, <>,\n"
+"ou utiliser la forme \\[texte du lien\\]\\(url\\)\n"
+
+#. type: Plain text
+msgid ""
+"In addition to basic html formatting using MarkDown, this wiki lets you "
+"use the following additional features:"
+msgstr ""
+"En plus du formatage html élémentaire avec MarkDown, ce wiki offre "
+"d'autres possibilités :"
+
+#. type: Bullet: '* '
+msgid ""
+"To link to another page on the wiki, place the page's name inside double "
+"square brackets. So you would use `\[[WikiLink]]` to link to WikiLink."
+msgstr ""
+"Pour créer un lien vers une autre page du wiki, mettre le nom de la page "
+"entre deux paires de crochets. Ainsi, utilisez `\[[WikiLink]]` pour un lien "
+"avec WikiLink."
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!if Error: syntax error in pagespec "\"enabled(smiley)"]] and some other useful symbols. :-)"
+msgstr "Insérer des smileys et d'autres symboles très utiles :-)"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!if Error: syntax error in pagespec "\"enabled(shortcut)"]] to link to common resources."
+msgstr "Utiliser des shortcuts pour renvoyer à des ressources communes."
+
+#. type: Plain text
+#, no-wrap
+msgid "\t\[[!wikipedia War\\_of\\_1812]]\n"
+msgstr "\t\[[!wikipedia War\\_of\\_1812]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!if Error: syntax error in pagespec "\"enabled(template)"]] for repeated chunks of parameterized wiki "
+"text."
+msgstr ""
+"Créer et utiliser des modèles (templates) pour répéter des morceaux de "
+"texte standard."
+
+#. type: Plain text
+#, no-wrap
+msgid ""
+"* Insert various directives onto a page to perform useful\n"
+" actions.\n"
+"[[!if Error: syntax error in pagespec "\"enabled(toc)\""]]\n"
+msgstr "\t\[[!toc ]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!if Error: syntax error in pagespec "\"enabled(meta)\""]]\n"
+msgstr "\t\[[!meta title=\"titre complet de la page\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!if Error: syntax error in pagespec "\"enabled(inline)\""]]\n"
+msgstr "\t\[[!inline pages=\"blog/*\"]]\n"
+
+#. type: Plain text
+#, no-wrap
+msgid "[[!if Error: syntax error in pagespec "\"enabled(listdirectives)\""]] enabled for this wiki:\n"
+msgstr " Voici la liste complète des directives activées sur ce wiki :\n"
+
+#. type: Plain text
+#, no-wrap
+msgid " [[!listdirectives ]]\n"
+msgstr " [[!listdirectives ]]\n"
+
+
+
+
+
+
+
+
+
+
+
+
+
Text on this wiki is, by default, written in a form very close to how
+you might write text for an email message. This style of text formatting
+is called MarkDown, and it works like
+this:
+
Leave blank lines between paragraphs.
+
You can *emphasise* or **strongly
+emphasise** text by placing it in single or double
+asterisks.
+
To create a list, start each line with an asterisk:
+
+
“* this is my list”
+
“* another item”
+
+
To make a numbered list, start each line with a number (any number
+will do) followed by a period:
+
+
“1. first line”
+
“2. second line”
+
“2. third line”
+
+
To create a header, start a line with one or more #
+characters followed by a space and the header text. The number of
+# characters controls the size of the header:
+
# h1
+
## h2
+
### h3
+
#### h4
+
##### h5
+
###### h6
+
To create a horizontal rule, just write three or more dashes or stars
+on their own line:
+
+
To quote someone, prefix the quote with “>”:
+
+
To be or not to be, that is the question.
+
+
To write a code block, indent each line with a tab or 4 spaces:
+
10 PRINT "Hello, world!"
+20 GOTO 10
+
To link to an url or email address, you can just put the url in angle
+brackets: <http://ikiwiki.info>, or you can use the form [link
+text](url)
+
+
In addition to basic html formatting using
+MarkDown, this wiki lets you use the
+following additional features:
+
+
To link to another page on the wiki, place the page’s name inside
+double square brackets. So you would use [[WikiLink]] to
+link to WikiLink.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ikiwiki/jquery.min.js b/ikiwiki/jquery.min.js
new file mode 100644
index 0000000..a085594
--- /dev/null
+++ b/ikiwiki/jquery.min.js
@@ -0,0 +1,23 @@
+/*
+ * jQuery JavaScript Library v1.6.2
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Jun 30 14:16:56 2011 -0400
+ */
+(function(a9,K){var aq=a9.document,br=a9.navigator,bi=a9.location;var b=(function(){var bC=function(bX,bY){return new bC.fn.init(bX,bY,bA)},bS=a9.jQuery,bE=a9.$,bA,bW=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bK=/\S/,bG=/^\s+/,bB=/\s+$/,bF=/\d/,bx=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bL=/^[\],:{}\s]*$/,bU=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bN=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bH=/(?:^|:|,)(?:\s*\[)+/g,bv=/(webkit)[ \/]([\w.]+)/,bP=/(opera)(?:.*version)?[ \/]([\w.]+)/,bO=/(msie) ([\w.]+)/,bQ=/(mozilla)(?:.*? rv:([\w.]+))?/,by=/-([a-z])/ig,bR=function(bX,bY){return bY.toUpperCase()},bV=br.userAgent,bT,bz,e,bJ=Object.prototype.toString,bD=Object.prototype.hasOwnProperty,bw=Array.prototype.push,bI=Array.prototype.slice,bM=String.prototype.trim,bs=Array.prototype.indexOf,bu={};bC.fn=bC.prototype={constructor:bC,init:function(bX,b1,b0){var bZ,b2,bY,b3;if(!bX){return this}if(bX.nodeType){this.context=this[0]=bX;this.length=1;return this}if(bX==="body"&&!b1&&aq.body){this.context=aq;this[0]=aq.body;this.selector=bX;this.length=1;return this}if(typeof bX==="string"){if(bX.charAt(0)==="<"&&bX.charAt(bX.length-1)===">"&&bX.length>=3){bZ=[null,bX,null]}else{bZ=bW.exec(bX)}if(bZ&&(bZ[1]||!b1)){if(bZ[1]){b1=b1 instanceof bC?b1[0]:b1;b3=(b1?b1.ownerDocument||b1:aq);bY=bx.exec(bX);if(bY){if(bC.isPlainObject(b1)){bX=[aq.createElement(bY[1])];bC.fn.attr.call(bX,b1,true)}else{bX=[b3.createElement(bY[1])]}}else{bY=bC.buildFragment([bZ[1]],[b3]);bX=(bY.cacheable?bC.clone(bY.fragment):bY.fragment).childNodes}return bC.merge(this,bX)}else{b2=aq.getElementById(bZ[2]);if(b2&&b2.parentNode){if(b2.id!==bZ[2]){return b0.find(bX)}this.length=1;this[0]=b2}this.context=aq;this.selector=bX;return this}}else{if(!b1||b1.jquery){return(b1||b0).find(bX)}else{return this.constructor(b1).find(bX)}}}else{if(bC.isFunction(bX)){return b0.ready(bX)}}if(bX.selector!==K){this.selector=bX.selector;this.context=bX.context}return bC.makeArray(bX,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return bI.call(this,0)},get:function(bX){return bX==null?this.toArray():(bX<0?this[this.length+bX]:this[bX])},pushStack:function(bY,b0,bX){var bZ=this.constructor();if(bC.isArray(bY)){bw.apply(bZ,bY)}else{bC.merge(bZ,bY)}bZ.prevObject=this;bZ.context=this.context;if(b0==="find"){bZ.selector=this.selector+(this.selector?" ":"")+bX}else{if(b0){bZ.selector=this.selector+"."+b0+"("+bX+")"}}return bZ},each:function(bY,bX){return bC.each(this,bY,bX)},ready:function(bX){bC.bindReady();bz.done(bX);return this},eq:function(bX){return bX===-1?this.slice(bX):this.slice(bX,+bX+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bI.apply(this,arguments),"slice",bI.call(arguments).join(","))},map:function(bX){return this.pushStack(bC.map(this,function(bZ,bY){return bX.call(bZ,bY,bZ)}))},end:function(){return this.prevObject||this.constructor(null)},push:bw,sort:[].sort,splice:[].splice};bC.fn.init.prototype=bC.fn;bC.extend=bC.fn.extend=function(){var b6,bZ,bX,bY,b3,b4,b2=arguments[0]||{},b1=1,b0=arguments.length,b5=false;if(typeof b2==="boolean"){b5=b2;b2=arguments[1]||{};b1=2}if(typeof b2!=="object"&&!bC.isFunction(b2)){b2={}}if(b0===b1){b2=this;--b1}for(;b10){return}bz.resolveWith(aq,[bC]);if(bC.fn.trigger){bC(aq).trigger("ready").unbind("ready")}}},bindReady:function(){if(bz){return}bz=bC._Deferred();if(aq.readyState==="complete"){return setTimeout(bC.ready,1)}if(aq.addEventListener){aq.addEventListener("DOMContentLoaded",e,false);a9.addEventListener("load",bC.ready,false)}else{if(aq.attachEvent){aq.attachEvent("onreadystatechange",e);a9.attachEvent("onload",bC.ready);var bX=false;try{bX=a9.frameElement==null}catch(bY){}if(aq.documentElement.doScroll&&bX){bt()}}}},isFunction:function(bX){return bC.type(bX)==="function"},isArray:Array.isArray||function(bX){return bC.type(bX)==="array"},isWindow:function(bX){return bX&&typeof bX==="object"&&"setInterval" in bX},isNaN:function(bX){return bX==null||!bF.test(bX)||isNaN(bX)},type:function(bX){return bX==null?String(bX):bu[bJ.call(bX)]||"object"},isPlainObject:function(bY){if(!bY||bC.type(bY)!=="object"||bY.nodeType||bC.isWindow(bY)){return false}if(bY.constructor&&!bD.call(bY,"constructor")&&!bD.call(bY.constructor.prototype,"isPrototypeOf")){return false}var bX;for(bX in bY){}return bX===K||bD.call(bY,bX)},isEmptyObject:function(bY){for(var bX in bY){return false}return true},error:function(bX){throw bX},parseJSON:function(bX){if(typeof bX!=="string"||!bX){return null}bX=bC.trim(bX);if(a9.JSON&&a9.JSON.parse){return a9.JSON.parse(bX)}if(bL.test(bX.replace(bU,"@").replace(bN,"]").replace(bH,""))){return(new Function("return "+bX))()}bC.error("Invalid JSON: "+bX)},parseXML:function(bZ,bX,bY){if(a9.DOMParser){bY=new DOMParser();bX=bY.parseFromString(bZ,"text/xml")}else{bX=new ActiveXObject("Microsoft.XMLDOM");bX.async="false";bX.loadXML(bZ)}bY=bX.documentElement;if(!bY||!bY.nodeName||bY.nodeName==="parsererror"){bC.error("Invalid XML: "+bZ)}return bX},noop:function(){},globalEval:function(bX){if(bX&&bK.test(bX)){(a9.execScript||function(bY){a9["eval"].call(a9,bY)})(bX)}},camelCase:function(bX){return bX.replace(by,bR)},nodeName:function(bY,bX){return bY.nodeName&&bY.nodeName.toUpperCase()===bX.toUpperCase()},each:function(b0,b3,bZ){var bY,b1=0,b2=b0.length,bX=b2===K||bC.isFunction(b0);if(bZ){if(bX){for(bY in b0){if(b3.apply(b0[bY],bZ)===false){break}}}else{for(;b10&&bX[0]&&bX[bY-1])||bY===0||bC.isArray(bX));if(b0){for(;bZ1?aF.call(arguments,0):bz;if(!(--bv)){e.resolveWith(e,aF.call(bs,0))}}}if(bw>1){for(;bt
a";bv=bC.getElementsByTagName("*");bK=bC.getElementsByTagName("a")[0];if(!bv||!bv.length||!bK){return{}}bD=aq.createElement("select");bt=bD.appendChild(aq.createElement("option"));bB=bC.getElementsByTagName("input")[0];bz={leadingWhitespace:(bC.firstChild.nodeType===3),tbody:!bC.getElementsByTagName("tbody").length,htmlSerialize:!!bC.getElementsByTagName("link").length,style:/top/.test(bK.getAttribute("style")),hrefNormalized:(bK.getAttribute("href")==="/a"),opacity:/^0.55$/.test(bK.style.opacity),cssFloat:!!bK.style.cssFloat,checkOn:(bB.value==="on"),optSelected:bt.selected,getSetAttribute:bC.className!=="t",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bB.checked=true;bz.noCloneChecked=bB.cloneNode(true).checked;bD.disabled=true;bz.optDisabled=!bt.disabled;try{delete bC.test}catch(bH){bz.deleteExpando=false}if(!bC.addEventListener&&bC.attachEvent&&bC.fireEvent){bC.attachEvent("onclick",function(){bz.noCloneEvent=false});bC.cloneNode(true).fireEvent("onclick")}bB=aq.createElement("input");bB.value="t";bB.setAttribute("type","radio");bz.radioValue=bB.value==="t";bB.setAttribute("checked","checked");bC.appendChild(bB);bs=aq.createDocumentFragment();bs.appendChild(bC.firstChild);bz.checkClone=bs.cloneNode(true).cloneNode(true).lastChild.checked;bC.innerHTML="";bC.style.width=bC.style.paddingLeft="1px";bA=aq.getElementsByTagName("body")[0];by=aq.createElement(bA?"div":"body");bI={visibility:"hidden",width:0,height:0,border:0,margin:0};if(bA){b.extend(bI,{position:"absolute",left:-1000,top:-1000})}for(bF in bI){by.style[bF]=bI[bF]}by.appendChild(bC);bE=bA||bJ;bE.insertBefore(by,bE.firstChild);bz.appendChecked=bB.checked;bz.boxModel=bC.offsetWidth===2;if("zoom" in bC.style){bC.style.display="inline";bC.style.zoom=1;bz.inlineBlockNeedsLayout=(bC.offsetWidth===2);bC.style.display="";bC.innerHTML="";bz.shrinkWrapBlocks=(bC.offsetWidth!==2)}bC.innerHTML="