Recent changes to this wiki. Not to be confused with my history.

Complete source to the wiki is available on gitweb or by cloning this site.

links
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 1d367b2f..a72364d9 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -370,7 +370,8 @@ to remove the expansion card next to the power button.
 So obviously, don't do that. But that's not very helpful.
 
 An alternative is to make the power button do something else. With
-systemd-managed systems, it's actually quite easy. Add this to (say)
+systemd-managed systems, it's actually quite easy. Add a
+[HandlePowerKey](https://www.freedesktop.org/software/systemd/man/logind.conf.html#HandlePowerKey=) stanza to (say)
 `/etc/systemd/logind.conf.d/framework-suspend.conf`:
 
     [Login]
@@ -388,6 +389,9 @@ Then restart logind:
 And the power button will suspend! Long-press to power off doesn't
 actually work as the laptop *immediately* suspends...
 
+Note that there's probably half a dozen *other* ways of doing this,
+see [this](https://superuser.com/questions/699905/change-behavior-of-linux-power-button), [this](https://unix.stackexchange.com/questions/242129/how-to-set-power-button-to-shutdown-instead-of-suspend), or [that](https://askubuntu.com/questions/66723/how-do-i-modify-the-options-for-the-power-button).
+
 ### Special keybindings
 
 There is a series of "hidden" (as in: not labeled on the key)

power button trick
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index f7a6e3d4..1d367b2f 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -359,6 +359,35 @@ with something like this:
 But be aware that once you enable that tapping, you'll need to deal
 with palm detection...
 
+### Power button
+
+The power button is a *little* dangerous. It's quite easy to hit, as
+it's right next to one expansion card where you are likely to plug in
+a cable power. And because the expansion cards are kind of hard to
+remove, you might squeeze the laptop (and the power key) when trying
+to remove the expansion card next to the power button.
+
+So obviously, don't do that. But that's not very helpful.
+
+An alternative is to make the power button do something else. With
+systemd-managed systems, it's actually quite easy. Add this to (say)
+`/etc/systemd/logind.conf.d/framework-suspend.conf`:
+
+    [Login]
+    HandlePowerKey=suspend
+    HandlePowerKeyLongPress=poweroff
+
+You might have to create the directory first:
+
+    mkdir /etc/systemd/logind.conf.d/
+
+Then restart logind:
+
+    systemctl restart systemd-logind
+
+And the power button will suspend! Long-press to power off doesn't
+actually work as the laptop *immediately* suspends...
+
 ### Special keybindings
 
 There is a series of "hidden" (as in: not labeled on the key)

make a nice title
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 03fc70b0..f7a6e3d4 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -1,3 +1,5 @@
+[[!meta title="Framework 12th gen laptop review"]]
+
 The [Framework](https://frame.work) is a 13.5" laptop body with actually swappable
 parts, which makes it somewhat future-proof and certainly easily
 repairable, scoring an "exceedingly rare" [10/10 score from

grml, bios, kill switches
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 7d5f6ecf..03fc70b0 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -98,6 +98,7 @@ build will of course vary according to your needs.
    * MicroSD
    * 250-1000GB SSD
  * 3.5mm combo headphone jack
+ * Kill switches for microphone and camera
  * Battery: 55Wh
  * Camera: 1080p 60fps
  * Biometrics: Fingerprint Reader
@@ -413,6 +414,17 @@ Note that there's another solution flying around that fixes this by
 [changing permissions on the input device](https://community.frame.work/t/12th-gen-not-sending-xf86monbrightnessup-down/20605/24?u=anarcat) but I haven't tested
 that or seen confirmation it works.
 
+### Kill switches
+
+The Framework has two "[kill switches](https://en.wikipedia.org/wiki/Kill_switch)": one for the camera and the
+other for the microphone. The camera one actually disconnects the USB
+device when turned off, and the mic one seems to cut the circuit. It
+doesn't show up as muted, it just stops feeding the sound.
+
+Both kill switches are around the main camera, on top of the monitor,
+and quite discreet. Then turn "red" when enabled (i.e. "red" means
+"turned off").
+
 ## Monitor
 
 The monitor looks pretty good to my untrained eyes. I have yet to do
@@ -618,6 +630,10 @@ it failed some time after the initrd load with:
 
     Unable to find medium containing a live file system
 
+This, it turns out, was fixed in Debian lately, so a [daily GRML
+build](https://daily.grml.org/) will not have this problems. The upcoming 2022 release
+(likely 2022.10 or 2022.11) will also get the fix.
+
 I did manage to boot the [development version of the Debian
 installer](https://www.debian.org/devel/debian-installer/) which was a surprisingly good experience: it mounted the
 encrypted drives and did everything pretty smoothly. It even offered
@@ -630,6 +646,27 @@ drive lying around (backups FTW!) so I just swapped that in, rebooted
 in the Debian installer, and did a clean install. I wanted to switch
 to bookworm anyways, so I guess that's done too.
 
+## BIOS issues
+
+The Framework BIOS has some minor issues. One issue I personally
+encountered is that I had disabled `Quick boot` and `Quiet boot` in
+the BIOS to diagnose the above boot issues. This, in turn, triggers a
+bug where the BIOS boot manager (<kbd>F12</kbd>) would just hang
+completely. It would also fail to boot from an external USB drive.
+
+The [current fix](https://knowledgebase.frame.work/en_us/how-do-i-enter-the-bios-on-the-framework-laptop-HydmWf5Ad) (as of BIOS 3.03) is to re-enable both `Quick
+boot` and `Quiet boot`. Presumably this is something that will get
+fixed in a future BIOS update.
+
+Note that the following keybindings are active in the BIOS [POST
+check](https://en.wikipedia.org/wiki/Power-on_self-test):
+
+| Key               | Meaning                 |
+|-------------------|-------------------------|
+| <kbd>F2</kbd>     | Enter BIOS setup menu   |
+| <kbd>F12</kbd>    | Enter BIOS boot manager |
+| <kbd>Delete</kbd> | Enter BIOS setup menu   |
+
 ## Storage limitations
 
 Another thing that happened during setup is that I tried to copy over

add chat channels
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index d7c4312d..7d5f6ecf 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -1306,3 +1306,6 @@ long road trip across the continental US.
    * [repair guides](https://guides.frame.work/)
    * [Linux-specific guides](https://frame.work/linux)
    * [blog](https://frame.work/blog) ([RSS](https://frame.work/blog.rss))
+   * [chat is on Discord](https://community.frame.work/t/official-discord/14209/), but [bridged with Matrix](https://matrix.to/#/#framework-space:matrix.org), there's
+     [talk of bridging it with IRC as well](https://community.frame.work/t/official-discord/14209/13), for now there's a
+     handful of us in `#framework` on <https://libera.chat/>

kernel compilation notes
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index b7f3a1d1..d7c4312d 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -545,6 +545,46 @@ brightness controls (see above).
 There's also an [accelerometer](https://community.frame.work/t/why-is-there-an-accelerometer/3685), but it's [off by default](https://community.frame.work/t/why-is-there-an-accelerometer/3685/5?u=anarcat) and
 will be [removed from future builds](https://community.frame.work/t/why-is-there-an-accelerometer/3685/14?u=anarcat).
 
+## Performance tests
+
+### Compiling Linux 5.19.11
+
+On a single core, compiling the Debian version of the Linux kernel
+takes around 100 minutes:
+
+    5411.85user 673.33system 1:37:46elapsed 103%CPU (0avgtext+0avgdata 831700maxresident)k
+    10594704inputs+87448000outputs (9131major+410636783minor)pagefaults 0swaps
+
+This was using 16 watts of power, with full screen brightness.
+
+With all 16 cores (`make -j16`), it takes less than 25 minutes:
+
+    19251.06user 2467.47system 24:13.07elapsed 1494%CPU (0avgtext+0avgdata 831676maxresident)k
+    8321856inputs+87427848outputs (30792major+409145263minor)pagefaults 0swaps
+
+I had to plug the normal power supply after a few minutes because
+battery would actually run out using my desk's power grommet (34
+watts).
+
+During compilation, fans were spinning really hard, quite noisy, but
+not painfully so.
+
+The laptop was sucking 55 watts of power, steadily:
+
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Average  87.9   0.0  10.7   1.4   0.1 17.8 6583.6 5054.3 233.0 223.9 233.1  55.96
+     GeoMean  87.9   0.0  10.6   1.2   0.0 17.6 6427.8 5048.1 227.6 218.7 227.7  55.96
+      StdDev   1.4   0.0   1.2   0.6   0.2  3.0 1436.8  255.5 50.0 47.5 49.7   0.20
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Minimum  85.0   0.0   7.8   0.5   0.0 13.0 3594.0 4638.0 117.0 111.0 120.0  55.52
+     Maximum  90.8   0.0  12.9   3.5   0.8 38.0 10174.0 5901.0 374.0 362.0 375.0  56.41
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+    Summary:
+    CPU:  55.96 Watts on average with standard deviation 0.20
+    Note: power read from RAPL domains: package-0, uncore, package-0, core, psys.
+    These readings do not cover all the hardware in this device.
+
 # Software setup
 
 Once I had everything in the hardware setup, I figured, voilà, I'm
@@ -695,12 +735,6 @@ which I guess is expected.
 TODO: give battery estimates while streaming video, editing, browsing
 the web, etc.
 
-While compiling a Linux kernel, the laptop is using 16 watts of power,
-with full brightness, on one thread. With all 16 threads firing, it
-jumps up to 34 watts, enough that my desk grommet is not enough to
-keep the battery charged! When plugged in, power usage goes up to 55
-watts, and the power supply is struggling to charge the battery.
-
 ## Power management
 
 Compared to the Purism Librem 13v4, the *ongoing* power usage seems to
@@ -1228,10 +1262,6 @@ There was a related oddity when I had my Purism laptop shipped: it
 left from the west coast and seemed to enter on an endless, two week
 long road trip across the continental US.
 
-# Remaining work
-
- - TODO: compile a kernel
-
 # Other resources
 
  * dock questions:

notes about linux compilation, external resources
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index acfc3fff..b7f3a1d1 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -696,7 +696,10 @@ TODO: give battery estimates while streaming video, editing, browsing
 the web, etc.
 
 While compiling a Linux kernel, the laptop is using 16 watts of power,
-with full brightness.
+with full brightness, on one thread. With all 16 threads firing, it
+jumps up to 34 watts, enough that my desk grommet is not enough to
+keep the battery charged! When plugged in, power usage goes up to 55
+watts, and the power supply is struggling to charge the battery.
 
 ## Power management
 
@@ -1266,3 +1269,10 @@ long road trip across the continental US.
    * [votes seem to go towards Ethernet and full-sized SD card
      reader](https://community.frame.work/t/what-new-expansion-card-types-do-you-want-to-see-released/193)
    * check out [this forum category](https://community.frame.work/c/developer-program/expansion-card/90) for a cornucopia of those
+
+ * upstream resources:
+   * [community forum](https://community.frame.work/), lots of information, much support, wow!
+   * [knowledge base](https://frame.work/support)
+   * [repair guides](https://guides.frame.work/)
+   * [Linux-specific guides](https://frame.work/linux)
+   * [blog](https://frame.work/blog) ([RSS](https://frame.work/blog.rss))

more things
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index abfe92ff..acfc3fff 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -442,18 +442,6 @@ It just requires this blob in `/etc/X11/xorg.conf.d/backlight.conf`:
 This way I can control the actual backlight power with the brightness
 keys, and they do significantly reduce power usage.
 
-## Multimedia
-
-Those things also work:
-
- * webcam: splendid, best webcam I've ever had (but my standards are
-   really low)
- * onboard mic: works well, good gain (maybe a bit much)
- * onboard speakers: sound okay, a little metal-ish, loud enough to be
-   annoying, see [this thread for benchmarks](https://community.frame.work/t/speakers-sound-quality/1078), apparently pretty
-   good speakers
- - TODO: combo jack test
-
 ## Expansion ports
 
 I ordered a total of 10 expansion ports.
@@ -473,7 +461,9 @@ And there's *only* four expansion ports. Once you have two monitors,
 the drive, and power plugged in, bam, you're out of ports; there's
 nowhere to plug my Yubikey. So if this is going to be my daily driver,
 with a dual monitor setup, I will need a dock, which means more crap
-firmware and uncertainty, which isn't great.
+firmware and uncertainty, which isn't great. There are actually plans
+to make a dual-USB card, but that is [blocked](https://community.frame.work/t/why-no-dual-usb-c-card/2145/3?u=anarcat) on [designing an
+actual board](https://community.frame.work/t/what-new-expansion-card-types-do-you-want-to-see-released/193/3) for this.
 
 I can't wait to see more expansion ports produced. There's a [ethernet
 expansion card](https://frame.work/ca/en/products/ethernet-expansion-card) but it went out of stock basically the day it was
@@ -517,16 +507,43 @@ vice-versa!)
 
 This is awesome. And it works from *any* of the expansion ports, of
 course. There's a little led next to the expansion ports as well,
-which seem to indicate the charge status, but it's unclear to me
-*what* exactly the colors mean. It *seems* like "orange" means
-"charging" and "white" means "charged", but I am not completely sure,
-and I [couldn't find documentation about this](https://community.frame.work/t/what-do-the-charging-led-colors-mean/23408).
+which indicate the charge status:
+
+ * red/amber: charging
+ * white: charged
+ * off: unplugged
+ 
+I [couldn't find documentation about this](https://community.frame.work/t/what-do-the-charging-led-colors-mean/23408), but [the forum
+answered](https://community.frame.work/t/what-do-the-charging-led-colors-mean/23408/2?u=anarcat).
 
 This is something of a recurring theme with the Framework. While it
-has a good [knowledge base](https://knowledgebase.frame.work/) and [repair/setup guides](https://guides.frame.work/), it
-doesn't have a good "owner manual" that shows you the different parts
-of the laptop and what they do. Again, something the [MNT reform did
-well](https://shop.mntmn.com/products/mnt-reform-operator-handbook).
+has a good [knowledge base](https://knowledgebase.frame.work/) and [repair/setup guides](https://guides.frame.work/) (and the
+[forum is awesome](https://community.frame.work/)) but it doesn't have a good "owner manual" that
+shows you the different parts of the laptop and what they do. Again,
+something the [MNT reform did well](https://shop.mntmn.com/products/mnt-reform-operator-handbook).
+
+Another thing that people are asking about is an [external sleep
+indicator](https://community.frame.work/t/externally-visible-sleep-indicator/5615): because the power LED is on the main keyboard assembly,
+you don't actually see whether the device is active or not when the
+lid is closed.
+
+## Multimedia and other devices
+
+Those things also work:
+
+ * webcam: splendid, best webcam I've ever had (but my standards are
+   really low)
+ * onboard mic: works well, good gain (maybe a bit much)
+ * onboard speakers: sound okay, a little metal-ish, loud enough to be
+   annoying, see [this thread for benchmarks](https://community.frame.work/t/speakers-sound-quality/1078), apparently pretty
+   good speakers
+ - TODO: combo jack test
+
+There's also a light sensor, but it conflicts with the keyboard
+brightness controls (see above).
+
+There's also an [accelerometer](https://community.frame.work/t/why-is-there-an-accelerometer/3685), but it's [off by default](https://community.frame.work/t/why-is-there-an-accelerometer/3685/5?u=anarcat) and
+will be [removed from future builds](https://community.frame.work/t/why-is-there-an-accelerometer/3685/14?u=anarcat).
 
 # Software setup
 
@@ -1239,7 +1256,8 @@ long road trip across the continental US.
  * cool expansion port mods:
    * [empty drawer](https://community.frame.work/t/the-snack-drawer-v2-back-in-snacktion/18442)
    * [dual USB-C](https://community.frame.work/t/dual-usb-c-expansion-card-mockup/2325) (mockup only), [expansion hub](https://community.frame.work/t/project-idea-expansion-card-hub/10988/2) (just an idea,
-     references other discussions)
+     references other discussions), actually [seriously considered by
+     Framework](https://community.frame.work/t/what-new-expansion-card-types-do-you-want-to-see-released/193/3?u=anarcat), limited by existing chipsets for now
    * [full-size SD card reader](https://community.frame.work/t/i-found-an-sd-card-reader-that-fits/9910)
    * [magnetic charger](https://community.frame.work/t/full-power-magnetic-charging-card/10113)
    * [Yubikey 5 case](https://community.frame.work/t/yubikey-5c-adapter/23157)

final framework edit
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 66d7829f..abfe92ff 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -38,7 +38,7 @@ them. If you plan to have a two-monitor setup, you're likely going to
 need a dock.
 
 Read on for the detailed review. For context, I'm moving from the
-[[Purism Librem 13v4|hardware/purism-librem13v4]] because it
+[[Purism Librem 13v4|hardware/laptop/purism-librem13v4]] because it
 [[basically exploded on me|blog/2022-08-25-one-dead-purism-laptop]]. I
 had, in the meantime, reverted back to an old ThinkPad X220, so I
 sometimes compare the Framework with that venerable laptop as well.
@@ -212,7 +212,7 @@ the laptop.
    for a crowdsourced effort to track those](https://docs.google.com/spreadsheets/d/10bhWkvOnaLhFG7RsZmb0uwKo4F8tBJWlTqXToUyIDX0/edit#gid=1658320056)
 
  * compared to my previous laptop ([[Purism Librem
-   13v4|hardware/purism-librem13v4]]), it feels strangely bulkier and
+   13v4|hardware/laptop/purism-librem13v4]]), it feels strangely bulkier and
    heavier; it's actually *lighter* than the purism (1.3kg vs 1.4kg)
    and thinner (15.85mm vs 18mm) but the design of the framework
    (tapered edges) makes it *feel* thinner
@@ -370,7 +370,7 @@ find quite useful.
 
 It looks like those are [defined in the microcontroller](https://github.com/FrameworkComputer/EmbeddedController/blob/03897d4070b3accdb216d2e72e40134a6b5958e0/board/hx20/keyboard_customization.c#L370-L408) so it
 would be possible to add some. For example, the <kbd>SysRq</kbd> key
-is *almost* bound to <kbd>fn-s</kbd> in there.
+is *almost* bound to <kbd>fn</kbd> <kbd>s</kbd> in there.
 
 Note that most other shortcuts like this are clearly documented
 (volume, brightness, etc). One key that's less obvious is
@@ -384,10 +384,10 @@ The keyboard backlight can be cycled with <kbd>fn-space</kbd>. The
 dimmer version is dim enough, and the keybinding is easy to find in
 the dark.
 
-A [skinny elephant](https://en.wikipedia.org/wiki/Magic_SysRq_key) would be performed with <kbd>Alt PrtScr
-KEY</kbd>, so for example <kbd>Alt PrtScr b</kbd> should do a hard
-reset. You might have to hold the <kbd>fn</kbd> key as well if you're
-in fn lock mode.
+A [skinny elephant](https://en.wikipedia.org/wiki/Magic_SysRq_key) would be performed with <kbd>Alt</kbd>
+<kbd>PrtScr</kbd> <kbd>KEY</kbd>, so for example <kbd>Alt</kbd>
+<kbd>PrtScr</kbd> <kbd>b</kbd> should do a hard reset. You might have
+to hold the <kbd>fn</kbd> key as well if you're in fn lock mode.
 
 Out of the box, some of the <kbd>fn</kbd> keys don't work. Mute,
 volume up/down, brightness, monitor changes, and the airplane mode key
@@ -542,7 +542,7 @@ the three following days thinkering with the laptop.
 ## Secure boot and EFI
 
 First, I couldn't boot off of the NVMe drive I transferred from the
-previous laptop (the [[Purism|hardware/purism-librem13v4]]) and the
+previous laptop (the [[Purism|hardware/laptop/purism-librem13v4]]) and the
 BIOS was not very helpful: it was just complaining about not finding
 any boot device, without dropping me in the real BIOS. 
 
@@ -589,8 +589,8 @@ It *might* be recoverable, but just restoring the partition table
 didn't work either, so I'm not sure how I recover the data
 there. Normally, everything on my laptops and workstations is designed
 to be disposable, so that wasn't that big of a problem. I did manage
-to recover most of the data thanks to [git-annex](https://git-annex.branchable.com/), but that was a
-little hairy.
+to recover most of the data thanks to [git-annex](https://git-annex.branchable.com/) [reinit](https://git-annex.branchable.com/git-annex-reinit/), but
+that was a little hairy.
 
 ## WiFi compatibility issues
 
@@ -653,25 +653,33 @@ deployed in LVFS, but that might very well be because there are
 
 ## Battery life
 
-Battery life is disappointing. I was having between about 7 hours of
-battery on the Purism Librem 13v4, and that's after a year or two of
-battery life. Now, I *still* have about 7 hours of battery life, which
-is nicer than my old Thinkpad X220 (20 minutes!) but really, it's not
-good for a new generation laptop.
-
-I was hoping the 12th generation Intel chipset would improve things
-compared to the previous one. And while it's possible it *is* the case
-(after all, I don't have a 11th gen Framework to compare with), it
-does feel a little disappointing to see that 7 hour estimate on a
-brand new laptop.
+I was having between about 7 hours of battery on the Purism Librem
+13v4, and that's after a year or two of battery life. Now, I *still*
+have about 7 hours of battery life, which is nicer than my old
+Thinkpad X220 (20 minutes!) but really, it's not *that* good for a new
+generation laptop. The 12th generation Intel chipset probably improved
+things compared to the previous one Framework laptop, but I don't have
+a 11th gen Framework to compare with).
 
 (Note that those are estimates from my status bar, not wall clock
 measurements. They should still be comparable between the Purism and
 Framework, that said.)
 
-The battery life is certainly not up to, say, Dell XPS 13, Thinpad X1,
-and of course not the Apple M1, where I would expect 10+ hours of
-battery life out of the box.
+The battery life doesn't seem up to, say, Dell XPS 13, Thinpad X1, and
+of course not the Apple M1, where I would expect 10+ hours of battery
+life out of the box.
+
+That said, I do get those kind estimates when the machine is fully
+charged and idle. In fact, when everything is quiet and nothing is
+plugged in, I get *dozens* of hours of battery life estimated (I've
+seen 25h!). So power usage fluctuates quite a bit depending on usage,
+which I guess is expected.
+
+TODO: give battery estimates while streaming video, editing, browsing
+the web, etc.
+
+While compiling a Linux kernel, the laptop is using 16 watts of power,
+with full brightness.
 
 ## Power management
 
@@ -682,40 +690,41 @@ be slightly better. An anecdotal metric is that the Purism would take
 without any active expansion card, except the storage. Those numbers
 come from the output of `tlp-stat -b` and, unfortunately, the "ampere"
 unit makes it quite hard to compare those, because voltage is not
-necessarily the same.
+necessarily the same between the two platforms.
+
+TODO: review [Arch Linux's tips](https://wiki.archlinux.org/title/Power_management#Power_saving) on power saving
 
 ### Background on CPU architecture
 
-The power problems were already present in the 11th gen, according to
-[this report from Linux After Dark][linux-after-dark-framework], so the issues with power
+There were power problems in the 11th gen Framework laptop, according
+to [this report from Linux After Dark][linux-after-dark-framework], so the issues with power
 management on the Framework are not new.
 
-But the 12th generation Intel CPU (AKA "[Alder Lake](https://en.wikipedia.org/wiki/Alder_Lake)") is a
-[big-little architecture](https://en.wikipedia.org/wiki/Heterogeneous_computing) with "power-saving" and "performance"
-cores. There used to be [performance problems introduced by the
-scheduler in Linux 5.16](https://www.theregister.com/2021/12/01/linux_5_16_alder_lake/) but those were eventually [fixed in
-5.18](https://linux.slashdot.org/story/22/02/12/2237234/intel-thread-director-is-headed-to-linux-for-a-major-boost-in-alder-lake-performance), which uses Intel's hardware as an "intelligent, low-latency
-hardware-assisted scheduler". According [to Phoronix](https://www.phoronix.com/review/linux-519-alderlakep), the 5.19
-release improved the power saving, at the cost of some penalty
-cost. There were also [patch series](https://www.phoronix.com/news/Cluster-Scheduling-Configure) to make the scheduler
-configurable, but it doesn't look those have been merged as of 5.19.
+The 12th generation Intel CPU (AKA "[Alder Lake](https://en.wikipedia.org/wiki/Alder_Lake)") is a [big-little
+architecture](https://en.wikipedia.org/wiki/Heterogeneous_computing) with "power-saving" and "performance" cores. There
+used to be [performance problems introduced by the scheduler in Linux
+5.16](https://www.theregister.com/2021/12/01/linux_5_16_alder_lake/) but those were eventually [fixed in 5.18](https://linux.slashdot.org/story/22/02/12/2237234/intel-thread-director-is-headed-to-linux-for-a-major-boost-in-alder-lake-performance), which uses
+Intel's hardware as an "intelligent, low-latency hardware-assisted
+scheduler". According [to Phoronix](https://www.phoronix.com/review/linux-519-alderlakep), the 5.19 release improved the
+power saving, at the cost of some penalty cost. There were also [patch
+series](https://www.phoronix.com/news/Cluster-Scheduling-Configure) to make the scheduler configurable, but it doesn't look
+those have been merged as of 5.19.
 
 All this to say that the 12gen Intel line shipped with this Framework
-series is supposed to have better power management at the core level,
-with power-saving cores. And Linux has had the scheduler changes to
-make use of this, so this should not be the source of power management
+series *should* have better power management thanks to its
+power-saving cores. And Linux has had the scheduler changes to make
+use of this, so this should not be the source of power management
 problems on my laptop, quite the opposite.
 
 Also note that the [firmware updates for various chipsets](https://news.ycombinator.com/item?id=31434021) are
-supposed to improve things eventually, but I'll believe it when I see
-it.
+supposed to improve things eventually.
 
 ### Attempts at improving power usage
 
 I did try to follow some of the tips in [this forum post](https://community.frame.work/t/linux-battery-life-tuning/6665). The
 tricks `powertop --auto-tune` and `tlp`'s
-`PCIE_ASPM_ON_BAT=powersupersave` basically do nothing: I'm stuck at
-10W power usage in powertop (600+mA in `tlp-stat`).
+`PCIE_ASPM_ON_BAT=powersupersave` basically did nothing: I was stuck
+at 10W power usage in powertop (600+mA in `tlp-stat`).
 
 Apparently, I should be able to reach the `C8` CPU power state (or
 even `C9`, `C10`) in powertop, but I seem to be stock at
@@ -733,18 +742,19 @@ Expansion cards actually *do* take up power, and so does the screen,
 obviously. The fully-lit screen takes a solid 2-3W of power compared
 to the fully dimmed screen. When removing *all* expansion cards and
 making the laptop idle, I can spin it down to 4 watts power usage at
-the moment.
+the moment, and an amazing 2 watts when the screen turned off.
 
 ### Caveats
 
-This could be a problem with my desktop configuration: I have this
-silly status bar that updates every second and probably causes
-redraws... The CPU certainly doesn't spin down below 1GHz. Also note
-that this is with an actual desktop running with everything: it could
-very well be that some things (I'm looking at you Signal Desktop) take
-up unreasonable amount of power on their own (hello, 1W/electron,
-sheesh). (Syncthing and containerd (Docker!) also each take a good 500mW
-just sitting there.)
+Abusive (10W+) power usage that I initially found could be a problem
+with my desktop configuration: I have this silly status bar that
+updates every second and probably causes redraws... The CPU certainly
+doesn't seem to spin down below 1GHz. Also note that this is with an
+actual desktop running with everything: it could very well be that
+some things (I'm looking at you Signal Desktop) take up unreasonable
+amount of power on their own (hello, 1W/electron, sheesh). Syncthing
+and containerd (Docker!) also seem to take a good 500mW just sitting

(Diff truncated)
fix typo
diff --git a/hardware/laptop/framework-12th-gen/powerstat.md b/hardware/laptop/framework-12th-gen/powerstat.md
index cb516472..ef72870e 100644
--- a/hardware/laptop/framework-12th-gen/powerstat.md
+++ b/hardware/laptop/framework-12th-gen/powerstat.md
@@ -236,7 +236,7 @@ test below.
 
 ### radios: +0.13W min, +0.14W average, +0.05W stdev
 
-## Conclusion
+## Conclusion: radios take 100mW+
 
 Overall, radios seem to add a minimum of 0.10W (or 100mW) of power
 usage to the tests. That's minimal, of course, but it does
@@ -337,7 +337,7 @@ outliers messing with the numbers.
     Summary:
     System:   2.09 Watts on average with standard deviation 0.05
 
-### conclusion: USB-C cards do not take little to no power
+### conclusion: USB-C cards take little to no power
 
 It looks like the theory that USB-C cards are passive is valid. From
 the above, we *may* have a 30mW power drain between one and two USB-C

tone down power management issues, some edits
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 08395d30..66d7829f 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -22,13 +22,16 @@ have managed, remotely, more powerful servers, but this is the fastest
 computer I have ever owned, and it fits in this tiny case. This is an
 amazing machine.
 
-On the downside, it has serious power management issues. There's a lot
-of proprietary firmware required (WiFi, Bluetooth, some graphics) and
-the Framework ships with a proprietary BIOS, with currently [no
-Coreboot support](https://news.ycombinator.com/item?id=32926736). Expect to need the latest kernel, firmware, and
-hacking around a bunch of things to get resolution and keybindings to
-get the laptop to work right. Don't expect week-long suspend, or full
-day battery.
+On the downside, there's a lot of proprietary firmware required (WiFi,
+Bluetooth, some graphics) and the Framework ships with a proprietary
+BIOS, with currently [no Coreboot support](https://news.ycombinator.com/item?id=32926736). Expect to need the
+latest kernel, firmware, and hacking around a bunch of things to get
+resolution and keybindings to get the laptop to work right. Like
+others, I have first found significant power management issues, but
+many issues can actually be solved with some configuration. Some of
+the expansion ports (HDMI, DP, MicroSD, and SSD) use power when idle,
+so don't expect week-long suspend, or full day battery while those are
+plugged in.
 
 Finally, the expansion ports are nice, but there's only four of
 them. If you plan to have a two-monitor setup, you're likely going to
@@ -51,6 +54,8 @@ Those are things I wish I would have known before buying:
     to fill those expansion slots otherwise they snag around and feel
     insecure
 
+ 2. you will likely need a dock if you want a two-monitor setup
+
  2. you might need to do some tuning to get proper (10h+ idle, 10 days
     suspend) power savings
 
@@ -67,7 +72,8 @@ Those are things I wish I would have known before buying:
 # Current status
 
 I have the framework! It's setup with a fresh new Debian bookworm
-installation.
+installation. I've ran through a large number of tests and burn in and
+I'm satisfied I can use this as a daily driver.
 
 See also the bottom of the page for last update date for this specific
 page.
@@ -325,16 +331,9 @@ The keyboard feels nice, for a laptop. I'm used to mechanical keyboard
 and I'm rather violent with those poor things. Yet the key travel is
 nice and it's clickety enough that I don't feel too disoriented.
 
-Working on an external keyboard feels laggy, that said. Typing this I
-actually went back and forth between the physical keyboard and my
-external USB keyboard, plugged into a dock, and I could feel a
-difference. It's really hard to tell without an end-to-end test, but
-overall the experience of typing this in Emacs feels laggier than what
-it used to before. This could just be a feeling however, hard to tell
-for sure.
-
-I certainly feel the Framework as being more laggy than my normal
-workstation setup.
+At first, I felt the keyboard as being more laggy than my normal
+workstation setup, but it turned out this was a graphics driver
+issues. After enabling a composition manager, everything feels snappy.
 
 The touchpad feels good. The double-finger scroll works well enough,
 and I don't have to wonder too much where the middle button is, it
@@ -357,15 +356,6 @@ with something like this:
 But be aware that once you enable that tapping, you'll need to deal
 with palm detection...
 
-The keyboard backlight can be cycled with <kbd>fn-space</kbd>. The
-dimmer version is dim enough, and the keybinding is easy to find in
-the dark.
-
-A [skinny elephant](https://en.wikipedia.org/wiki/Magic_SysRq_key) would be performed with <kbd>Alt PrtScr
-KEY</kbd>, so for example <kbd>Alt PrtScr b</kbd> should do a hard
-reset. You might have to hold the <kbd>fn</kbd> key as well if you're
-in fn lock mode.
-
 ### Special keybindings
 
 There is a series of "hidden" (as in: not labeled on the key)
@@ -390,20 +380,14 @@ absolutely nothing here. By default, on Windows, it [opens your
 browser to the Framework website](https://knowledgebase.frame.work/en_us/what-does-the-framework-button-on-my-keyboard-do-Sk3XlBpw9) and, on Linux, your "default
 media player".
 
-The keyboard backlight is less obvious: it's on <kbd>fn-space</kbd>.
-
-## Monitor
-
-The monitor looks pretty good to my untrained eyes. I have yet to do
-photography work on it, but some photos I looked at look sharp and the
-colors are bright and lively. The blacks are dark and the screen is
-bright.
-
-I have yet to use it in full sunlight.
-
-The dimmed light is very dim, which I like.
+The keyboard backlight can be cycled with <kbd>fn-space</kbd>. The
+dimmer version is dim enough, and the keybinding is easy to find in
+the dark.
 
-### Function keys and screen backlight
+A [skinny elephant](https://en.wikipedia.org/wiki/Magic_SysRq_key) would be performed with <kbd>Alt PrtScr
+KEY</kbd>, so for example <kbd>Alt PrtScr b</kbd> should do a hard
+reset. You might have to hold the <kbd>fn</kbd> key as well if you're
+in fn lock mode.
 
 Out of the box, some of the <kbd>fn</kbd> keys don't work. Mute,
 volume up/down, brightness, monitor changes, and the airplane mode key
@@ -429,8 +413,21 @@ Note that there's another solution flying around that fixes this by
 [changing permissions on the input device](https://community.frame.work/t/12th-gen-not-sending-xf86monbrightnessup-down/20605/24?u=anarcat) but I haven't tested
 that or seen confirmation it works.
 
-I bind those keys to `xbacklight` in i3, so out of the box I get this
-error:
+## Monitor
+
+The monitor looks pretty good to my untrained eyes. I have yet to do
+photography work on it, but some photos I looked at look sharp and the
+colors are bright and lively. The blacks are dark and the screen is
+bright.
+
+I have yet to use it in full sunlight.
+
+The dimmed light is very dim, which I like.
+
+### Screen backlight
+
+I bind brightness keys to `xbacklight` in i3, but out of the box I get
+this error:
 
     sep 29 22:09:14 angela i3[5661]: No outputs have backlight property
 
@@ -442,9 +439,8 @@ It just requires this blob in `/etc/X11/xorg.conf.d/backlight.conf`:
         Option      "Backlight"  "intel_backlight"
     EndSection
 
-It's possible this configuration doesn't actually reduce the power
-usage on the display, which could explain some of the power management
-issues I'm having.
+This way I can control the actual backlight power with the brightness
+keys, and they do significantly reduce power usage.
 
 ## Multimedia
 
@@ -460,11 +456,12 @@ Those things also work:
 
 ## Expansion ports
 
-I ordered a total of 10 expansion ports. I have actually not used all
-of them yet. I did manage to initialize the 1TB drive as an encrypted
-storage, mostly to keep photos as this is something that takes a
-massive amount of space (500GB and counting) and that I
-(unfortunately) don't work on very often (but still carry around).
+I ordered a total of 10 expansion ports.
+
+I did manage to initialize the 1TB drive as an encrypted storage,
+mostly to keep photos as this is something that takes a massive amount
+of space (500GB and counting) and that I (unfortunately) don't work on
+very often (but still carry around).
 
 The expansion ports are fancy and nice, but not actually that
 convenient. They're hard to take out: you really need to crimp your
@@ -479,20 +476,21 @@ with a dual monitor setup, I will need a dock, which means more crap
 firmware and uncertainty, which isn't great.
 
 I can't wait to see more expansion ports produced. There's a [ethernet
-expansion card](https://frame.work/ca/en/products/ethernet-expansion-card) coming Real Soon -- you can order in some regions
-already -- and I would very much like to see a proper SD-card
-reader. There's a *MicroSD* card reader, but that obviously doesn't
-work for normal SD cards, which would be more broadly compatible
-anyways (because you can have a MicroSD to SD card adapter, but I have
-never heard of the reverse).
-
-(Update: someone actually [found a SD card reader that fits](https://community.frame.work/t/i-found-an-sd-card-reader-that-fits/9910) and
-then [someone else managed to cram it in a 3D printed case](https://community.frame.work/t/i-found-an-sd-card-reader-that-fits/9910/18?u=anarcat). This
-is bonkers.)
+expansion card](https://frame.work/ca/en/products/ethernet-expansion-card) but it went out of stock basically the day it was
+announced. I would like to see a proper SD-card reader. There's a
+*MicroSD* card reader, but that obviously doesn't work for normal SD
+cards, which would be more broadly compatible anyways (because you can
+have a MicroSD to SD card adapter, but I have never heard of the
+reverse). Someone actually [found a SD card reader that fits](https://community.frame.work/t/i-found-an-sd-card-reader-that-fits/9910) and
+then [someone else managed to cram it in a 3D printed case](https://community.frame.work/t/i-found-an-sd-card-reader-that-fits/9910/18?u=anarcat), which
+is kind of amazing.
 
 Still, I really like that idea that I can carry all those little
 adapters in a pouch when I travel and can basically do anything I
-want.
+want. It does mean I need to shuffle through them to find the right
+one which is a little annoying. I'm considering having an elastic band
+or *something* to keep them all together so that all the ports show
+the same side. That way it would be easier to find the right one.
 
 The expansion ports *do* take up some power, even when idle. See the
 [power management](#power-management) section below, and particularly the [power usage
@@ -506,20 +504,23 @@ lying around to charge my phone, and I can just grab that thing and
 pop it in my laptop. And while it will obviously not charge as fast as

(Diff truncated)
skinny
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index dcd922c6..08395d30 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -361,6 +361,11 @@ The keyboard backlight can be cycled with <kbd>fn-space</kbd>. The
 dimmer version is dim enough, and the keybinding is easy to find in
 the dark.
 
+A [skinny elephant](https://en.wikipedia.org/wiki/Magic_SysRq_key) would be performed with <kbd>Alt PrtScr
+KEY</kbd>, so for example <kbd>Alt PrtScr b</kbd> should do a hard
+reset. You might have to hold the <kbd>fn</kbd> key as well if you're
+in fn lock mode.
+
 ### Special keybindings
 
 There is a series of "hidden" (as in: not labeled on the key)

hotkeys
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 2185fba5..dcd922c6 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -361,7 +361,31 @@ The keyboard backlight can be cycled with <kbd>fn-space</kbd>. The
 dimmer version is dim enough, and the keybinding is easy to find in
 the dark.
 
-TODO: where's my "pause", screen lock, and skinny elephant?
+### Special keybindings
+
+There is a series of "hidden" (as in: not labeled on the key)
+keybindings related to the <kbd>fn</kbd> keybinding that I actually
+find quite useful.
+
+| Key          | Equivalent       | Effect      | Command           |
+|--------------|------------------|-------------|-------------------|
+| <kbd>p</kbd> | <kbd>Pause</kbd> | lock screen | `xset s activate` |
+| <kbd>b</kbd> | <kbd>Break</kbd> | ? | ? |
+| <kbd>k</kbd> | <kbd>ScrLk</kbd> | switch keyboard layout | N/A |
+
+It looks like those are [defined in the microcontroller](https://github.com/FrameworkComputer/EmbeddedController/blob/03897d4070b3accdb216d2e72e40134a6b5958e0/board/hx20/keyboard_customization.c#L370-L408) so it
+would be possible to add some. For example, the <kbd>SysRq</kbd> key
+is *almost* bound to <kbd>fn-s</kbd> in there.
+
+Note that most other shortcuts like this are clearly documented
+(volume, brightness, etc). One key that's less obvious is
+<kbd>F12</kbd> that only has the Framework logo on it. That actually
+calls the keysym `XF86AudioMedia` which, interestingly, does
+absolutely nothing here. By default, on Windows, it [opens your
+browser to the Framework website](https://knowledgebase.frame.work/en_us/what-does-the-framework-button-on-my-keyboard-do-Sk3XlBpw9) and, on Linux, your "default
+media player".
+
+The keyboard backlight is less obvious: it's on <kbd>fn-space</kbd>.
 
 ## Monitor
 

yet another todo
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index f740e140..2185fba5 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -843,6 +843,8 @@ back down to the normal line.
 TODO: one final solution here is [suspend-then-hibernate](https://wiki.archlinux.org/title/Power_management/Suspend_and_hibernate), which
 Windows uses for this
 
+TODO: review [Arch Linux's tips](https://wiki.archlinux.org/title/Power_management#Power_saving) on power saving
+
 ### Detailed power usage tests
 
 Some expansion cards waste energy, even when unused. Here is a summary

make a hardware review section
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 2a523df3..f740e140 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -317,6 +317,187 @@ laptop with the keyboard unscrewed as I was putting the drives in and
 out, and it actually works fine (and will probably void your warranty,
 so don't do that). (But you can.) (But don't, really.)
 
+# Hardware review
+
+## Keyboard and touchpad
+
+The keyboard feels nice, for a laptop. I'm used to mechanical keyboard
+and I'm rather violent with those poor things. Yet the key travel is
+nice and it's clickety enough that I don't feel too disoriented.
+
+Working on an external keyboard feels laggy, that said. Typing this I
+actually went back and forth between the physical keyboard and my
+external USB keyboard, plugged into a dock, and I could feel a
+difference. It's really hard to tell without an end-to-end test, but
+overall the experience of typing this in Emacs feels laggier than what
+it used to before. This could just be a feeling however, hard to tell
+for sure.
+
+I certainly feel the Framework as being more laggy than my normal
+workstation setup.
+
+The touchpad feels good. The double-finger scroll works well enough,
+and I don't have to wonder too much where the middle button is, it
+just works.
+
+Taps don't work, out of the box: that needs to be enabled in Xorg,
+with something like this:
+
+    cat > /etc/X11/xorg.conf.d/40-libinput.conf <<EOF
+    Section "InputClass"
+          Identifier "libinput touchpad catchall"
+          MatchIsTouchpad "on"
+          MatchDevicePath "/dev/input/event*"
+          Driver "libinput"
+          Option "Tapping" "on"
+          Option "TappingButtonMap" "lmr"
+    EndSection
+    EOF
+
+But be aware that once you enable that tapping, you'll need to deal
+with palm detection...
+
+The keyboard backlight can be cycled with <kbd>fn-space</kbd>. The
+dimmer version is dim enough, and the keybinding is easy to find in
+the dark.
+
+TODO: where's my "pause", screen lock, and skinny elephant?
+
+## Monitor
+
+The monitor looks pretty good to my untrained eyes. I have yet to do
+photography work on it, but some photos I looked at look sharp and the
+colors are bright and lively. The blacks are dark and the screen is
+bright.
+
+I have yet to use it in full sunlight.
+
+The dimmed light is very dim, which I like.
+
+### Function keys and screen backlight
+
+Out of the box, some of the <kbd>fn</kbd> keys don't work. Mute,
+volume up/down, brightness, monitor changes, and the airplane mode key
+all do basically nothing. They don't send proper keysyms to Xorg at
+all.
+
+This is a [known problem](https://community.frame.work/t/12th-gen-not-sending-xf86monbrightnessup-down/20605) and it's related to the fact that the
+laptop has light sensors to adjust the brightness
+automatically. Somehow some of those keys (e.g. the brightness
+controls) are supposed to show up as a different input device, but
+don't seem to work correctly. It seems like the solution is for the
+Framework team to write a driver specifically for this, but [so far no
+progress since July 2022](https://community.frame.work/t/12th-gen-not-sending-xf86monbrightnessup-down/20605/34?u=anarcat).
+
+In the meantime, the fancy functionality can be supposedly disabled with:
+
+    echo 'blacklist hid_sensor_hub' | sudo tee /etc/modprobe.d/framework-als-blacklist.conf
+
+... and a reboot. This solution is also [documented in the upstream
+guide](https://guides.frame.work/Guide/Fedora+36+Installation+on+the+Framework+Laptop/108?lang=en#s734).
+
+Note that there's another solution flying around that fixes this by
+[changing permissions on the input device](https://community.frame.work/t/12th-gen-not-sending-xf86monbrightnessup-down/20605/24?u=anarcat) but I haven't tested
+that or seen confirmation it works.
+
+I bind those keys to `xbacklight` in i3, so out of the box I get this
+error:
+
+    sep 29 22:09:14 angela i3[5661]: No outputs have backlight property
+
+It just requires this blob in `/etc/X11/xorg.conf.d/backlight.conf`:
+
+    Section "Device"
+        Identifier  "Card0"
+        Driver      "intel"
+        Option      "Backlight"  "intel_backlight"
+    EndSection
+
+It's possible this configuration doesn't actually reduce the power
+usage on the display, which could explain some of the power management
+issues I'm having.
+
+## Multimedia
+
+Those things also work:
+
+ * webcam: splendid, best webcam I've ever had (but my standards are
+   really low)
+ * onboard mic: works well, good gain (maybe a bit much)
+ * onboard speakers: sound okay, a little metal-ish, loud enough to be
+   annoying, see [this thread for benchmarks](https://community.frame.work/t/speakers-sound-quality/1078), apparently pretty
+   good speakers
+ - TODO: combo jack test
+
+## Expansion ports
+
+I ordered a total of 10 expansion ports. I have actually not used all
+of them yet. I did manage to initialize the 1TB drive as an encrypted
+storage, mostly to keep photos as this is something that takes a
+massive amount of space (500GB and counting) and that I
+(unfortunately) don't work on very often (but still carry around).
+
+The expansion ports are fancy and nice, but not actually that
+convenient. They're hard to take out: you really need to crimp your
+fingernails on there and pull hard to take them out. There's a little
+button next to them to release, I think, but it still feels a little
+scary to pull those pucks out of there.
+
+And there's *only* four expansion ports. Once you have two monitors,
+the drive, and power plugged in, bam, you're out of ports; there's
+nowhere to plug my Yubikey. So if this is going to be my daily driver,
+with a dual monitor setup, I will need a dock, which means more crap
+firmware and uncertainty, which isn't great.
+
+I can't wait to see more expansion ports produced. There's a [ethernet
+expansion card](https://frame.work/ca/en/products/ethernet-expansion-card) coming Real Soon -- you can order in some regions
+already -- and I would very much like to see a proper SD-card
+reader. There's a *MicroSD* card reader, but that obviously doesn't
+work for normal SD cards, which would be more broadly compatible
+anyways (because you can have a MicroSD to SD card adapter, but I have
+never heard of the reverse).
+
+(Update: someone actually [found a SD card reader that fits](https://community.frame.work/t/i-found-an-sd-card-reader-that-fits/9910) and
+then [someone else managed to cram it in a 3D printed case](https://community.frame.work/t/i-found-an-sd-card-reader-that-fits/9910/18?u=anarcat). This
+is bonkers.)
+
+Still, I really like that idea that I can carry all those little
+adapters in a pouch when I travel and can basically do anything I
+want.
+
+The expansion ports *do* take up some power, even when idle. See the
+[power management](#power-management) section below, and particularly the [power usage
+tests](#detailed-power-usage-tests) for details.
+
+## USB-C charging
+
+One thing that is really a game changer for me is USB-C charging. It's
+hard to overstate how convenient this is. I often have a USB-C cable
+lying around to charge my phone, and I can just grab that thing and
+pop it in my laptop. And while it will obviously not charge as fast as
+the provided charger, it will stop draining tha battery at least.
+
+(As an example just now, I had the laptop plugged in the Samsung
+charger that came with a phone, and it was telling me it would take 6
+hours to charge the remaining 15%. With the provided charger, that
+flew down to *15 minutes*.)
+
+I also really like the idea that I can charge my laptop with a power
+bank or, hell, with my *phone* if push comes to shove.
+
+This is awesome. And it works from *any* of the expansion ports, of
+course. There's a little led next to the expansion ports as well,
+which seem to indicate the charge status, but it's unclear to me
+*what* exactly the colors mean. It *seems* like "orange" means
+"charging" and "white" means "charged", but I am not completely sure,
+and I couldn't find documentation on that directly.
+
+This is something of a recurring theme with the Framework. While it
+has a good [knowledge base](https://knowledgebase.frame.work/) and [repair/setup guides](https://guides.frame.work/), it
+doesn't have a good "owner manual" that shows you the different parts
+of the laptop and what they do. Again, something the [MNT reform did
+well](https://shop.mntmn.com/products/mnt-reform-operator-handbook).
+
 # Software setup
 
 Once I had everything in the hardware setup, I figured, voilà, I'm
@@ -710,115 +891,6 @@ instructions on how to disable the card in software. The MicroSD card
 has been reported as [using 2 watts](https://community.frame.work/t/12th-gen-battery-questions-on-linux/20729/33?u=anarcat), but I've seen it as high as 6
 watts, which is pretty damning.
 
-## Expansion ports
-
-I ordered a total of 10 expansion ports. I have actually not used all
-of them yet. I did manage to initialize the 1TB drive as an encrypted

(Diff truncated)
merge sections about power usage
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 67171609..2a523df3 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -44,6 +44,8 @@ sometimes compare the Framework with that venerable laptop as well.
 
 # Advice for buyers
 
+Those are things I wish I would have known before buying:
+
  1. consider buying 4 USB-C expansion cards, or at least 4 USB-A or
     USB-C cards. they use less power than other cards and you do want
     to fill those expansion slots otherwise they snag around and feel
@@ -633,7 +635,7 @@ That's 180mAh in about 3.5h, 52mA! Now at 66h, or almost 3 days. Not
 sure why I am seeing fluctuations in those tests, it's possible that
 my test bench is not quite good enough.
 
-As it turns out, [expansion card power tests](#power-usage) show that they *do*
+As it turns out, [expansion card power tests](#detailed-power-usage-tests) show that they *do*
 significantly affect power usage, especially the SSD drive, which can
 take up to two *full* watts of power even when idle. Presumably that
 is what is affecting the above fluctuations and abusive power drain.
@@ -662,46 +664,6 @@ Windows uses for this
 
 ### Detailed power usage tests
 
-See [[powerstat]] and the [detailed analysis below](#power-usage).
-
-## Expansion ports
-
-I ordered a total of 10 expansion ports. I have actually not used all
-of them yet. I did manage to initialize the 1TB drive as an encrypted
-storage, mostly to keep photos as this is something that takes a
-massive amount of space (500GB and counting) and that I
-(unfortunately) don't work on very often (but still carry around).
-
-The expansion ports are fancy and nice, but not actually that
-convenient. They're hard to take out: you really need to crimp your
-fingernails on there and pull hard to take them out. There's a little
-button next to them to release, I think, but it still feels a little
-scary to pull those pucks out of there.
-
-And there's *only* four expansion ports. Once you have two monitors,
-the drive, and power plugged in, bam, you're out of ports; there's
-nowhere to plug my Yubikey. So if this is going to be my daily driver,
-with a dual monitor setup, I will need a dock, which means more crap
-firmware and uncertainty, which isn't great.
-
-I can't wait to see more expansion ports produced. There's a [ethernet
-expansion card](https://frame.work/ca/en/products/ethernet-expansion-card) coming Real Soon -- you can order in some regions
-already -- and I would very much like to see a proper SD-card
-reader. There's a *MicroSD* card reader, but that obviously doesn't
-work for normal SD cards, which would be more broadly compatible
-anyways (because you can have a MicroSD to SD card adapter, but I have
-never heard of the reverse).
-
-(Update: someone actually [found a SD card reader that fits](https://community.frame.work/t/i-found-an-sd-card-reader-that-fits/9910) and
-then [someone else managed to cram it in a 3D printed case](https://community.frame.work/t/i-found-an-sd-card-reader-that-fits/9910/18?u=anarcat). This
-is bonkers.)
-
-Still, I really like that idea that I can carry all those little
-adapters in a pouch when I travel and can basically do anything I
-want.
-
-### Power usage
-
 Some expansion cards waste energy, even when unused. Here is a summary
 of the findings from the [[powerstat]] page. I also include other
 devices tested in this page for completeness:
@@ -748,6 +710,42 @@ instructions on how to disable the card in software. The MicroSD card
 has been reported as [using 2 watts](https://community.frame.work/t/12th-gen-battery-questions-on-linux/20729/33?u=anarcat), but I've seen it as high as 6
 watts, which is pretty damning.
 
+## Expansion ports
+
+I ordered a total of 10 expansion ports. I have actually not used all
+of them yet. I did manage to initialize the 1TB drive as an encrypted
+storage, mostly to keep photos as this is something that takes a
+massive amount of space (500GB and counting) and that I
+(unfortunately) don't work on very often (but still carry around).
+
+The expansion ports are fancy and nice, but not actually that
+convenient. They're hard to take out: you really need to crimp your
+fingernails on there and pull hard to take them out. There's a little
+button next to them to release, I think, but it still feels a little
+scary to pull those pucks out of there.
+
+And there's *only* four expansion ports. Once you have two monitors,
+the drive, and power plugged in, bam, you're out of ports; there's
+nowhere to plug my Yubikey. So if this is going to be my daily driver,
+with a dual monitor setup, I will need a dock, which means more crap
+firmware and uncertainty, which isn't great.
+
+I can't wait to see more expansion ports produced. There's a [ethernet
+expansion card](https://frame.work/ca/en/products/ethernet-expansion-card) coming Real Soon -- you can order in some regions
+already -- and I would very much like to see a proper SD-card
+reader. There's a *MicroSD* card reader, but that obviously doesn't
+work for normal SD cards, which would be more broadly compatible
+anyways (because you can have a MicroSD to SD card adapter, but I have
+never heard of the reverse).
+
+(Update: someone actually [found a SD card reader that fits](https://community.frame.work/t/i-found-an-sd-card-reader-that-fits/9910) and
+then [someone else managed to cram it in a 3D printed case](https://community.frame.work/t/i-found-an-sd-card-reader-that-fits/9910/18?u=anarcat). This
+is bonkers.)
+
+Still, I really like that idea that I can carry all those little
+adapters in a pouch when I travel and can basically do anything I
+want.
+
 ## USB-C charging
 
 One thing that is really a game changer for me is USB-C charging. It's

copy the actual nice results
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 8dbec223..e9e50a0d 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -623,7 +623,8 @@ devices](https://community.frame.work/t/guide-automatically-disable-usb-devices-
 *much* better suspend performance by unplugging *all* modules. Then I
 get this result:
 
-TODO: copy-paste from angela
+    oct 04 11:15:38 angela systemd-sleep[257571]: /sys/class/power_supply/BAT1/charge_now                     =   3203 [mAh]
+    oct 04 15:09:32 angela systemd-sleep[257866]: /sys/class/power_supply/BAT1/charge_now                     =   3145 [mAh]
 
 Which is 14.8mA! Exactly the number promised by Framework! With a full
 battery, that means a 10 days suspend time. This is actually pretty

advice i wish i knew about
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index e9e50a0d..67171609 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -42,6 +42,26 @@ sometimes compare the Framework with that venerable laptop as well.
 
 [[!toc levels=5]]
 
+# Advice for buyers
+
+ 1. consider buying 4 USB-C expansion cards, or at least 4 USB-A or
+    USB-C cards. they use less power than other cards and you do want
+    to fill those expansion slots otherwise they snag around and feel
+    insecure
+
+ 2. you might need to do some tuning to get proper (10h+ idle, 10 days
+    suspend) power savings
+
+ 3. beware that the MicroSD card is what it says: Micro, normal SD
+    cards won't fit, and while there might be [full sized](https://community.frame.work/t/i-found-an-sd-card-reader-that-fits/9910) one
+    eventually, it's currently only at the prototyping stage
+
+ 4. beware that the HDMI, DisplayPort and *particularly* the SSD and
+    MicroSD cards *do* take power, up to 2-6W for the latter two
+
+ 5. the Framework monitor has an unusual aspect ratio: I like it, but
+    it might surprise you
+
 # Current status
 
 I have the framework! It's setup with a fresh new Debian bookworm

analyse and summarize powerstat results
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 857e1a45..8dbec223 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -544,10 +544,10 @@ In comparison, here is my really old x220, before:
 
     sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/energy_now                     =   4980 [mWh]
 
-... which is 90 mwH in 10 minutes, or a whopping 540mA, which was fine
-when this battery was new (62000 mAh, so about 100 hours, or about 5
-days), but this battery is almost dead and has *only* 5210 mAh when
-full, so only 10 hours standby.
+... which is 90 mwH in 10 minutes, or a whopping 540mA, which was
+possibly fine when this battery was new (62000 mAh, so about 100
+hours, or about 5 days), but this battery is almost dead and has
+*only* 5210 mAh when full, so only 10 hours standby.
 
 And here is the Framework performing a similar test, before:
 
@@ -566,18 +566,12 @@ bad.
 Note that this was done with the following expansion cards:
 
  * 2 USB-C
- * 1 1TB thumb drive
+ * 1 1TB SSD drive
  * 1 USB-A with a hub connected to it, with keyboard and LAN
 
 Preliminary tests without the hub (over one minute) show that it
-doesn't significantly affect this power consumption (300mA).
-
-TODO: results in the power managemnet section (particularly with
-USB-A) show that this could actually be a problem. redo suspend tests
-without any expansion ports.
-
-TOOD: consider [suspend-then-hibernate](https://wiki.archlinux.org/title/Power_management/Suspend_and_hibernate)
-TODO: consider [suspend USB devices](https://community.frame.work/t/guide-automatically-disable-usb-devices-for-battery-savings/20392)
+doesn't significantly affect this power consumption
+(300mA).
 
 [This guide](https://guides.frame.work/Guide/Fedora+36+Installation+on+the+Framework+Laptop/108?lang=en#s655) also suggests booting with `nvme.noacpi=1` but this
 still gives me about 5mAh/min (or 300mA). 
@@ -597,6 +591,11 @@ power usage, and more than an order of magnitude more than the Purism
 laptop. It's also far from the 0.4% promised by upstream, which would
 be 14mA.
 
+It should also be noted that the "deep" sleep mode is a little more
+disruptive than regular sleep. As you can see by the timing, it took
+more than 10 seconds for the laptop to resume, which feels a little
+alarming as your banging the keyboard to bring it back to life.
+
 Here's another test:
 
     sep 30 22:25:50 angela systemd-sleep[32207]: /sys/class/power_supply/BAT1/charge_now                     =   1619 [mAh]
@@ -614,24 +613,35 @@ That's 180mAh in about 3.5h, 52mA! Now at 66h, or almost 3 days. Not
 sure why I am seeing fluctuations in those tests, it's possible that
 my test bench is not quite good enough.
 
-In any case, it feels far from a normal power usage, and I wish this would be
-something the Framework project would really prioritize at this
-point. There *is* [some hope](https://news.ycombinator.com/item?id=32930511) that the [Chromebook edition](https://frame.work/at/en/blog/introducing-the-framework-laptop-chromebook-edition) —
-specifically designed with a [specification of 14 days standby time](https://news.ycombinator.com/item?id=32927094) —
-could bring some firmware improvements back down to the normal
-line. And, here again, it's possible my system configuration might be
-screwing with standby mode.
+As it turns out, [expansion card power tests](#power-usage) show that they *do*
+significantly affect power usage, especially the SSD drive, which can
+take up to two *full* watts of power even when idle. Presumably that
+is what is affecting the above fluctuations and abusive power drain.
 
-It should also be noted that the "deep" sleep mode is a little more
-disruptive than regular sleep. As you can see by the timing, it took
-more than 10 seconds for the laptop to resume, which feels a little
-alarming as your banging the keyboard to bring it back to life.
+It might be possible to work around this problem by [disabling USB
+devices](https://community.frame.work/t/guide-automatically-disable-usb-devices-for-battery-savings/20392) before suspend. In the meantime, I have been able to get
+*much* better suspend performance by unplugging *all* modules. Then I
+get this result:
+
+TODO: copy-paste from angela
+
+Which is 14.8mA! Exactly the number promised by Framework! With a full
+battery, that means a 10 days suspend time. This is actually pretty
+good, and far beyond what I was expecting when starting down this
+journey.
+
+Once the expansion cards are unplugged, suspend power usage is
+actually quite reasonable. There is also [some hope](https://news.ycombinator.com/item?id=32930511) that the
+[Chromebook edition](https://frame.work/at/en/blog/introducing-the-framework-laptop-chromebook-edition) — specifically designed with a [specification
+of 14 days standby time](https://news.ycombinator.com/item?id=32927094) — could bring some firmware improvements
+back down to the normal line.
 
-TODO: redo those tests with all expansion cards unplugged.
+TODO: one final solution here is [suspend-then-hibernate](https://wiki.archlinux.org/title/Power_management/Suspend_and_hibernate), which
+Windows uses for this
 
 ### Detailed power usage tests
 
-See [[powerstat]].
+See [[powerstat]] and the [detailed analysis below](#power-usage).
 
 ## Expansion ports
 
@@ -671,81 +681,51 @@ want.
 
 ### Power usage
 
-Interestingly, I could *not* reproduce the power usage of the
-expansion ports when idle, at least not the massive 500-1000mW power
-drains I have seen reported elsewhere.
-
-I *did* see a slight power drain on the USB-A connectors,
-surprisingly. It looks like USB-A connectors have this fundamental
-flaw that they necessarily draw *some* powers because they lack the
-power negociation features of USB-C. At least [according to this
-post](https://community.frame.work/t/12th-gen-battery-questions-on-linux/20729/24?u=anarcat):
+Some expansion cards waste energy, even when unused. Here is a summary
+of the findings from the [[powerstat]] page. I also include other
+devices tested in this page for completeness:
+
+| Device       | Minimum | Average | Max   | Stdev | Note                                                |
+|--------------|---------|---------|-------|-------|-----------------------------------------------------|
+| Screen, 100% | 2.4W    | 2.6W    | 2.8W  | N/A   |                                                     |
+| Screen, 1%   | 30mW    | 140mW   | 250mW | N/A   |                                                     |
+| Radios       | 100mW   | 250mW   | N/A   | N/A   |                                                     |
+| USB-C        | N/A     | N/A     | N/A   | N/A   | negligible power drain                              |
+| USB-A        | 10mW    | 10mW    | ?     | 10mW  | almost negligible                                   |
+| DisplayPort  | 300mW   | 390mW   | 600mW | N/A   | not passive                                         |
+| HDMI         | 380mW   | 440mW   | 1W?   | 20mW  | not passive                                         |
+| 1TB SSD      | 1.65W   | 1.79W   | 2W    | 12mW  | significant, probably higher when busy              |
+| MicroSD      | 1.6W    | 3W      | 6W    | 1.93W | highest power usage, possibly even higher when busy |
+
+So it looks like *all* expansion cards but the USB-C ones are active,
+i.e. they draw power with idle. The USB-A cards are the least concern,
+sucking out 10mW, pretty much within the margin of error. But both the
+DisplayPort and HDMI do take a few hundred miliwatts. It looks like
+USB-A connectors have this fundamental flaw that they necessarily draw
+*some* powers because they lack the power negociation features of
+USB-C. At least [according to this post](https://community.frame.work/t/12th-gen-battery-questions-on-linux/20729/24?u=anarcat):
 
 > It seems the USB A must have power going to it all the time, that
 > the old USB 2 and 3 protocols, the USB C only provides power when
 > there is a connection. Old versus new.
 
-And this is something I can reproduce with:
-
-    sudo powerstat -d 30 1 600
-
-Without the USB-A card:
-
-    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
-     Average   0.3   0.0   0.2  99.5   0.0  1.0 1878.5  427.4  8.3  1.8  8.3   5.02
-     GeoMean   0.2   0.0   0.0  99.5   0.0  1.0 1802.4  411.7  7.9  1.4  8.0   5.01
-      StdDev   0.1   0.0   0.1   0.2   0.1  0.2  678.9  140.2  2.7  1.5  2.7   0.12
-    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
-     Minimum   0.1   0.0   0.0  98.8   0.0  1.0 1317.0  289.0  6.0  1.0  6.0   4.87
-     Maximum   0.7   0.1   0.6  99.7   0.3  2.0 5123.0 1105.0 16.0  8.0 16.0   5.26
-    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
-    Summary:
-    System:   5.02 Watts on average with standard deviation 0.12
-
-With:
-
-    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
-     Average   0.4   0.0   0.2  99.3   0.1  1.1 2329.1  525.4 10.0  2.8 10.0   6.60
-     GeoMean   0.3   0.0   0.1  99.3   0.0  1.0 2098.1  495.0  8.7  1.7  8.9   6.59
-      StdDev   0.4   0.0   0.2   0.6   0.1  0.3 1542.9  209.5  7.7  4.8  6.5   0.13
-    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
-     Minimum   0.1   0.0   0.1  96.0   0.0  1.0 1443.0  313.0  6.0  1.0  6.0   6.42
-     Maximum   2.4   0.0   1.4  99.8   0.6  3.0 10707.0 1414.0 43.0 24.0 37.0   6.92
-    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
-    Summary:
-    System:   6.60 Watts on average with standard deviation 0.13
-
-Those are preliminary results: I have not actually let the test run
-its full 5 minutes course (I interrupted it after roughly 40 seconds
-out of impatience) nor do I let it "settle down" correctly (`-d 3`
-is 3 seconds instead of the normal 3 minutes). So take those results
-with a grain of salt.
-
-TODO: redo the above tests with the full, normal powerstat mode
-
-But it *does* seem to show that the USB-A adapter is taking up a
-**full ONE WATT** of power (and maybe even 1.5W!), even when
-completely idle and unplugged. 
-
 [Apparently](https://community.frame.work/t/12th-gen-battery-questions-on-linux/20729/43), this is a problem *specific* to the USB-C to USB-A
-adapter that ships with the Framework: normal laptops with normal
-USB-A adapters obviously do *not* take 1W of power per USB-A port. So
-this could actually be fixable in a new, improved, USB-A expansion
-port. Some people have [actually changed their orders to all USB-C](https://community.frame.work/t/12th-gen-battery-questions-on-linux/20729/27?u=anarcat)
-because of this problem.
-
-The HDMI, DisplayPort, SSD drive, and MicroSD cars were reported to
-have big power draws, even when idle. The latter two, in particular,
-have been reported has causing big power drains, with the SSD ranging
-from [1.4W](https://community.frame.work/t/linux-battery-life-tuning/6665/179) to [5W](https://community.frame.work/t/1-tb-expansion-card-consume-5w/17391). The [former post](https://community.frame.work/t/linux-battery-life-tuning/6665/179) has instructions on
-how to disable the card in software. The MicroSD card is reportedly
-[using 2 watts](https://community.frame.work/t/12th-gen-battery-questions-on-linux/20729/33?u=anarcat).
-
-In my tests, I couldn't detect this power draw at first, but that was

(Diff truncated)
add headings to all tables
diff --git a/hardware/laptop/framework-12th-gen/powerstat.md b/hardware/laptop/framework-12th-gen/powerstat.md
index c0b6e3ca..ed6f5e61 100644
--- a/hardware/laptop/framework-12th-gen/powerstat.md
+++ b/hardware/laptop/framework-12th-gen/powerstat.md
@@ -56,6 +56,7 @@ batch (below) and were retroactively added back here.
 This is the same test result as the "100% brightness, no radios, no
 modules" test below.
 
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.1   0.0   0.1  99.7   0.0  1.0 1102.5  288.9 85.9 21.7 86.4   4.70
      GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1098.1  287.8 83.5 19.2 83.9   4.70
@@ -69,6 +70,7 @@ modules" test below.
 
 ### radios on, +0.03W min, +-0W average, +0.01W stdev
 
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.1   0.0   0.1  99.7   0.0  1.1 1073.7  276.0 83.3 20.5 84.3   4.70
      GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1067.2  275.0 81.8 18.9 82.7   4.70
@@ -87,6 +89,7 @@ modules" test below.
 This is the same test result as the "minimum brightness, no radios, no
 modules" test below.
 
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.1   0.0   0.1  99.7   0.0  1.1 1036.1  275.0 82.5 20.5 82.6   2.24
      GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1031.4  274.0 81.0 18.8 81.0   2.24
@@ -100,6 +103,7 @@ modules" test below.
 
 ### radios: +0.29W min, +0.25W average, +0.25W stdev
 
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.2   0.0   0.1  99.6   0.0  1.0 1540.7  361.6 82.8 18.6 83.1   2.49
      GeoMean   0.2   0.0   0.1  99.6   0.0  1.0 1527.3  351.4 82.0 17.8 82.3   2.48
@@ -117,6 +121,7 @@ modules" test below.
 
 This is the same as the "screen off, no radios, no modules" test below.
 
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.2   0.0   0.1  99.7   0.0  1.0 1116.0  331.7 82.9 19.7 82.7   2.24
      GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1100.8  305.4 81.8 18.5 81.7   2.22
@@ -130,6 +135,7 @@ This is the same as the "screen off, no radios, no modules" test below.
 
 ### radios: +0.10W min, +0.25W average, +0.04W stdev
 
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.2   0.0   0.1  99.6   0.1  1.0 1577.7  377.9 83.5 19.6 83.9   2.47
      GeoMean   0.2   0.0   0.1  99.6   0.0  1.0 1561.8  367.3 82.5 18.5 82.9   2.44
@@ -148,6 +154,7 @@ This is the same as the "screen off, no radios, no modules" test below.
 This is the same test result as the "screen off, no radios, 1 USB-C"
 test below.
 
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.1   0.0   0.1  99.7   0.0  1.0 1044.4  271.7 81.2 19.6 81.6   2.09
      GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1037.3  270.8 80.2 18.4 80.6   2.09
@@ -161,6 +168,7 @@ test below.
 
 ### radios: +0.18W min, +0.30W average, +0.34W stdev
 
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.2   0.0   0.1  99.6   0.0  1.0 1504.4  356.2 80.9 18.4 81.0   2.39
      GeoMean   0.2   0.0   0.1  99.6   0.0  1.0 1485.4  344.7 80.5 17.7 80.6   2.36
@@ -179,6 +187,7 @@ test below.
 This is the same test result as the "screen off, no radios, 2 USB-C"
 test below.
 
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.1   0.0   0.1  99.7   0.0  1.1 1100.6  282.5 86.9 21.7 86.8   2.09
      GeoMean   0.1   0.0   0.1  99.7   0.0  1.1 1096.0  281.3 84.7 19.6 84.7   2.09
@@ -192,6 +201,7 @@ test below.
 
 ### radios: +0.15W min, +0.44W average, +0.63W stdev
  
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.2   0.0   0.1  99.5   0.0  1.1 1608.6  388.2 87.4 20.5 87.0   2.53
      GeoMean   0.2   0.0   0.1  99.5   0.0  1.0 1568.0  364.4 84.5 18.8 84.3   2.46
@@ -240,6 +250,7 @@ So it's good that we redid those tests.
 
 ## 100% brightness, no modules
 
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.1   0.0   0.1  99.7   0.0  1.0 1102.5  288.9 85.9 21.7 86.4   4.70
      GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1098.1  287.8 83.5 19.2 83.9   4.70
@@ -253,6 +264,7 @@ So it's good that we redid those tests.
 
 ## minimum brightness, no modules
 
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.1   0.0   0.1  99.7   0.0  1.1 1036.1  275.0 82.5 20.5 82.6   2.24
      GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1031.4  274.0 81.0 18.8 81.0   2.24
@@ -268,6 +280,7 @@ So it's good that we redid those tests.
 
 ### no modules
 
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.2   0.0   0.1  99.7   0.0  1.0 1116.0  331.7 82.9 19.7 82.7   2.24
      GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1100.8  305.4 81.8 18.5 81.7   2.22
@@ -293,6 +306,7 @@ TODO: why is the above result higher than the USB-C result below?
 
 ### 1 USB-C
 
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.1   0.0   0.1  99.7   0.0  1.0 1044.4  271.7 81.2 19.6 81.6   2.09
      GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1037.3  270.8 80.2 18.4 80.6   2.09
@@ -306,6 +320,7 @@ TODO: why is the above result higher than the USB-C result below?
 
 ### 2 USB-C
 
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.1   0.0   0.1  99.7   0.0  1.1 1100.6  282.5 86.9 21.7 86.8   2.09
      GeoMean   0.1   0.0   0.1  99.7   0.0  1.1 1096.0  281.3 84.7 19.6 84.7   2.09
@@ -325,6 +340,7 @@ cards, but that is within the standard deviation (50mW).
 
 ### 1 USB-A
 
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.1   0.0   0.1  99.7   0.0  1.0 1052.7  279.1 81.6 19.6 81.6   2.11
      GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1049.1  278.3 80.5 18.4 80.6   2.11
@@ -338,6 +354,7 @@ cards, but that is within the standard deviation (50mW).
 
 ### 2 USB-A
 
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.1   0.0   0.1  99.7   0.0  1.0 1073.5  289.0 80.1 18.7 80.0   2.12
      GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1069.3  288.1 79.8 18.0 79.6   2.12
@@ -351,6 +368,7 @@ cards, but that is within the standard deviation (50mW).
 
 ### 3 USB-A
 
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.1   0.0   0.1  99.7   0.0  1.0 1074.0  286.1 81.7 19.8 82.0   2.13
      GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1067.8  284.9 80.6 18.6 80.9   2.13
@@ -376,6 +394,7 @@ TODO: document a baseline that we evaluate other modules from
 
 ### 1TB SSD
 
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.1   0.0   0.1  99.7   0.0  1.0 1127.2  283.4 87.5 21.7 87.9   3.89
      GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1123.0  282.6 85.4 19.6 85.8   3.89
@@ -389,6 +408,7 @@ TODO: document a baseline that we evaluate other modules from
 
 ### 1 MicroSD
 
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.1   1.3   0.1  98.4   0.0  1.3 1169.5  375.8 85.3 19.5 86.0   5.00
      GeoMean   0.1   0.0   0.1  98.4   0.0  1.2 1165.5  351.3 84.0 18.1 84.6   4.69
@@ -404,6 +424,7 @@ stdev 1.99!
 
 ### 1 HDMI
 
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.2   0.0   0.1  99.7   0.0  1.0 1151.7  287.7 86.2 20.5 86.4   2.86
      GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1148.1  286.2 84.6 18.6 84.8   2.86
@@ -417,6 +438,7 @@ stdev 1.99!
 
 ### 2 HDMI
 
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.2   0.0   0.1  99.6   0.0  1.0 1161.9  306.0 89.6 21.5 89.5   3.30
      GeoMean   0.2   0.0   0.1  99.6   0.0  1.0 1141.3  295.9 84.1 18.3 84.3   3.29
@@ -430,6 +452,7 @@ stdev 1.99!
 
 ### 1 DisplayPort
 
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.1   0.0   0.1  99.7   0.0  1.0 1120.7  282.4 84.0 19.6 84.7   2.49
      GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1117.2  281.6 83.1 18.4 83.7   2.49
@@ -443,6 +466,7 @@ stdev 1.99!
 
 ### no module again
 
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.1   0.0   0.1  99.7   0.0  1.0 1122.2  282.4 83.7 19.6 83.8   2.16
      GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1117.8  281.5 82.7 18.4 82.8   2.16

start working on power analysis conclusions
diff --git a/hardware/laptop/framework-12th-gen/powerstat.md b/hardware/laptop/framework-12th-gen/powerstat.md
index ff4eb393..c0b6e3ca 100644
--- a/hardware/laptop/framework-12th-gen/powerstat.md
+++ b/hardware/laptop/framework-12th-gen/powerstat.md
@@ -1,9 +1,61 @@
-# radio tests
+# Test procedure
+
+ 1. raise DPMS timeout to avoid screen saver skewing results:
+ 
+        xset 600 3
+
+ 2. prepare the test (disable/enable radios, plug in module, etc)
+
+ 3. set desired brightness, run test, reset brightness
+ 
+        sudo true; xbacklight -set 0 ; sudo powerstat ; xbacklight -set 100
+
+We run `sudo` before changing the backlight to make sure the `sudo`
+token is still recorded and the second `sudo` won't prompt us while
+the screen is blank.
+
+# Research hypothesis and bias
+
+My bias is to interpret results based on the "minimum": that's the
+ground, base noise that a new module (for example) would
+introduce. 
+
+The [powerstat](https://github.com/ColinIanKing/powerstat) tool is used here. It does, by default, 30 samples
+every 10 seconds (so for 5 minutes) with a 3 minute "settle down"
+period before. That settle-down period ensures the machine spins back
+down to idle so there's less be variation based on CPU usage or
+frequency scaling.
+
+If there's a result that's really out of whack, it will be rerun to
+see if we can reproduce.
+
+I originally forgot to turn off radios. I was assuming radios would
+take power and introduce variability, so all tests were reran with
+radios turned off, basically with the equivalent of `rfkill block
+all`, but done with the handy <kbd>fn-F10</kbd> keybinding which puts
+the laptop in "airplane mode".
+
+The hypothesis is that the screen, WiFi, and *some* modules take
+power. Specifically, I heard that USB-C and DisplayPort modules do
+*not* take power while all the others take some power, with the SSD
+and MicroSD cards taking up to 1 to 5W.
+
+# Radio tests
+
+Those tests were specifically done to see if turning on Bluetooth (not
+connected to anything) and WiFi (connected to a WPA access point)
+were taking power.
+
+The "radios on" tests here were actually done as part of the normal
+batch (below) and were retroactively added back here.
 
 ## 100% brightness, no modules
 
 ### no radios
 
+This is the same test result as the "100% brightness, no radios, no
+modules" test below.
+
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.1   0.0   0.1  99.7   0.0  1.0 1102.5  288.9 85.9 21.7 86.4   4.70
      GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1098.1  287.8 83.5 19.2 83.9   4.70
@@ -15,18 +67,7 @@
     Summary:
     System:   4.70 Watts on average with standard deviation 0.06
 
-It seems radio usage has little to no effect on the power
-usage. There *might* be a 30mW power drain on the minimum here, but
-the average doesn't change, and it's within the margin of error (or,
-more specifically, the standard deviation).
-
-This is surprising: I would have expected WiFi and Bluetooth receivers to
-consume at least *some* power. They probably do, but enabling the
-*software* kill-switch probably doesn't affect it.
-
-It should, hopefully, reduce the deviation in tests, however.
-
-### radios on
+### radios on, +0.03W min, +-0W average, +0.01W stdev
 
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.1   0.0   0.1  99.7   0.0  1.1 1073.7  276.0 83.3 20.5 84.3   4.70
@@ -43,6 +84,9 @@ It should, hopefully, reduce the deviation in tests, however.
 
 ### no radios
 
+This is the same test result as the "minimum brightness, no radios, no
+modules" test below.
+
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.1   0.0   0.1  99.7   0.0  1.1 1036.1  275.0 82.5 20.5 82.6   2.24
      GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1031.4  274.0 81.0 18.8 81.0   2.24
@@ -54,7 +98,7 @@ It should, hopefully, reduce the deviation in tests, however.
     Summary:
     System:   2.24 Watts on average with standard deviation 0.05
 
-### radios
+### radios: +0.29W min, +0.25W average, +0.25W stdev
 
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.2   0.0   0.1  99.6   0.0  1.0 1540.7  361.6 82.8 18.6 83.1   2.49
@@ -84,7 +128,7 @@ This is the same as the "screen off, no radios, no modules" test below.
     Summary:
     System:   2.24 Watts on average with standard deviation 0.33
 
-### radios
+### radios: +0.10W min, +0.25W average, +0.04W stdev
 
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.2   0.0   0.1  99.6   0.1  1.0 1577.7  377.9 83.5 19.6 83.9   2.47
@@ -115,7 +159,7 @@ test below.
     Summary:
     System:   2.09 Watts on average with standard deviation 0.07
 
-### radios
+### radios: +0.18W min, +0.30W average, +0.34W stdev
 
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.2   0.0   0.1  99.6   0.0  1.0 1504.4  356.2 80.9 18.4 81.0   2.39
@@ -146,7 +190,7 @@ test below.
     Summary:
     System:   2.09 Watts on average with standard deviation 0.05
 
-### radios
+### radios: +0.15W min, +0.44W average, +0.63W stdev
  
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.2   0.0   0.1  99.5   0.0  1.1 1608.6  388.2 87.4 20.5 87.0   2.53
@@ -159,23 +203,70 @@ test below.
     Summary:
     System:   2.53 Watts on average with standard deviation 0.68
 
-## scren off, 1 USB-A
- 
+## screen off, 1 USB-A
+
+### no radios
+
+This is the same test result as the "screen off, no radios, 1 USB-A"
+test below.
+
       Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
-     Average   0.2   0.0   0.1  99.7   0.0  1.0 1425.1  326.4 78.9 17.4 79.2   2.25
-     GeoMean   0.2   0.0   0.1  99.7   0.0  1.0 1417.3  323.9 78.9 17.2 79.1   2.25
-      StdDev   0.0   0.0   0.0   0.1   0.0  0.0  155.5   47.4  3.5  2.7  3.2   0.10
+     Average   0.1   0.0   0.1  99.7   0.0  1.0 1052.7  279.1 81.6 19.6 81.6   2.11
+     GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1049.1  278.3 80.5 18.4 80.6   2.11
+      StdDev   0.0   0.0   0.0   0.1   0.0  0.0   88.1   22.5 16.0  9.2 15.6   0.05
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Minimum   0.1   0.0   0.1  99.5   0.0  1.0  881.0  250.4 72.0 16.0 72.0   2.00
+     Maximum   0.2   0.2   0.2  99.8   0.1  1.0 1290.1  351.0 158.0 56.0 156.0   2.23
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+    Summary:
+    System:   2.11 Watts on average with standard deviation 0.05
+
+### radios: +0.13W min, +0.14W average, +0.05W stdev
+
+## Conclusion
+
+Overall, radios seem to add a minimum of 0.10W (or 100mW) of power
+usage to the tests. That's minimal, of course, but it does
+significantly increase standard deviation, by about half a watt.
+
+One theory is that an active network connection would trigger network
+traffic which in itself means more CPU usage, but it also means
+graphical updates as the status bar shows traffic measurements.
+
+So it's good that we redid those tests.
+
+# no radios tests
+
+## 100% brightness, no modules
+
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Average   0.1   0.0   0.1  99.7   0.0  1.0 1102.5  288.9 85.9 21.7 86.4   4.70
+     GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1098.1  287.8 83.5 19.2 83.9   4.70
+      StdDev   0.0   0.0   0.0   0.1   0.0  0.2   99.9   26.8 25.5 15.2 26.6   0.06
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Minimum   0.1   0.0   0.1  99.3   0.0  1.0  919.7  250.9 73.0 16.0 73.0   4.61
+     Maximum   0.2   0.2   0.2  99.8   0.1  2.0 1307.9  366.7 196.0 87.0 195.0   4.87
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+    Summary:
+    System:   4.70 Watts on average with standard deviation 0.06
+
+## minimum brightness, no modules
+
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Average   0.1   0.0   0.1  99.7   0.0  1.1 1036.1  275.0 82.5 20.5 82.6   2.24
+     GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1031.4  274.0 81.0 18.8 81.0   2.24
+      StdDev   0.0   0.0   0.0   0.1   0.0  0.4  100.4   23.2 20.6 12.7 20.5   0.05
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
-     Minimum   0.1   0.0   0.1  99.4   0.0  1.0 1209.4  285.5 74.0 16.0 74.0   2.13
-     Maximum   0.2   0.2   0.2  99.7   0.1  1.0 2006.0  564.1 87.0 23.0 87.0   2.68
+     Minimum   0.1   0.0   0.1  99.5   0.0  1.0  875.4  241.7 72.0 16.0 72.0   2.13

(Diff truncated)
add missing header
diff --git a/hardware/laptop/framework-12th-gen/powerstat.md b/hardware/laptop/framework-12th-gen/powerstat.md
index 247605c6..ff4eb393 100644
--- a/hardware/laptop/framework-12th-gen/powerstat.md
+++ b/hardware/laptop/framework-12th-gen/powerstat.md
@@ -161,6 +161,7 @@ test below.
 
 ## scren off, 1 USB-A
  
+      Time    User  Nice   Sys  Idle    IO  Run Ctxt/s  IRQ/s Fork Exec Exit  Watts
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.2   0.0   0.1  99.7   0.0  1.0 1425.1  326.4 78.9 17.4 79.2   2.25
      GeoMean   0.2   0.0   0.1  99.7   0.0  1.0 1417.3  323.9 78.9 17.2 79.1   2.25

finish running a battery of powerstat tests
diff --git a/hardware/laptop/framework-12th-gen/powerstat.md b/hardware/laptop/framework-12th-gen/powerstat.md
index deb3c032..247605c6 100644
--- a/hardware/laptop/framework-12th-gen/powerstat.md
+++ b/hardware/laptop/framework-12th-gen/powerstat.md
@@ -1,4 +1,32 @@
-# 100% brightness, no modules: 4.58W, 4.70W, 4.88W
+# radio tests
+
+## 100% brightness, no modules
+
+### no radios
+
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Average   0.1   0.0   0.1  99.7   0.0  1.0 1102.5  288.9 85.9 21.7 86.4   4.70
+     GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1098.1  287.8 83.5 19.2 83.9   4.70
+      StdDev   0.0   0.0   0.0   0.1   0.0  0.2   99.9   26.8 25.5 15.2 26.6   0.06
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Minimum   0.1   0.0   0.1  99.3   0.0  1.0  919.7  250.9 73.0 16.0 73.0   4.61
+     Maximum   0.2   0.2   0.2  99.8   0.1  2.0 1307.9  366.7 196.0 87.0 195.0   4.87
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+    Summary:
+    System:   4.70 Watts on average with standard deviation 0.06
+
+It seems radio usage has little to no effect on the power
+usage. There *might* be a 30mW power drain on the minimum here, but
+the average doesn't change, and it's within the margin of error (or,
+more specifically, the standard deviation).
+
+This is surprising: I would have expected WiFi and Bluetooth receivers to
+consume at least *some* power. They probably do, but enabling the
+*software* kill-switch probably doesn't affect it.
+
+It should, hopefully, reduce the deviation in tests, however.
+
+### radios on
 
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.1   0.0   0.1  99.7   0.0  1.1 1073.7  276.0 83.3 20.5 84.3   4.70
@@ -11,7 +39,22 @@
     Summary:
     System:   4.70 Watts on average with standard deviation 0.07
 
-# minimum brightness, no modules, 2.30W, 2.49W, 3.71W
+## minimum brightness, no modules
+
+### no radios
+
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Average   0.1   0.0   0.1  99.7   0.0  1.1 1036.1  275.0 82.5 20.5 82.6   2.24
+     GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1031.4  274.0 81.0 18.8 81.0   2.24
+      StdDev   0.0   0.0   0.0   0.1   0.0  0.4  100.4   23.2 20.6 12.7 20.5   0.05
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Minimum   0.1   0.0   0.1  99.5   0.0  1.0  875.4  241.7 72.0 16.0 72.0   2.13
+     Maximum   0.2   0.2   0.2  99.8   0.1  3.0 1317.4  342.2 186.0 80.0 186.0   2.35
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+    Summary:
+    System:   2.24 Watts on average with standard deviation 0.05
+
+### radios
 
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.2   0.0   0.1  99.6   0.0  1.0 1540.7  361.6 82.8 18.6 83.1   2.49
@@ -24,9 +67,24 @@
     Summary:
     System:   2.49 Watts on average with standard deviation 0.30
 
-# 0% brightness...
+## screen off, no modules
 
-## no modules: 2.16W, 2.47W, 3.56W
+### no radios
+
+This is the same as the "screen off, no radios, no modules" test below.
+
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Average   0.2   0.0   0.1  99.7   0.0  1.0 1116.0  331.7 82.9 19.7 82.7   2.24
+     GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1100.8  305.4 81.8 18.5 81.7   2.22
+      StdDev   0.1   0.0   0.0   0.1   0.0  0.0  208.8  225.2 15.4  9.3 15.1   0.33
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Minimum   0.1   0.0   0.1  99.1   0.0  1.0  849.8  231.8 72.0 16.0 72.0   2.06
+     Maximum   0.6   0.2   0.2  99.8   0.1  1.0 2038.4 1535.4 151.0 56.0 151.0   3.81
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+    Summary:
+    System:   2.24 Watts on average with standard deviation 0.33
+
+### radios
 
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.2   0.0   0.1  99.6   0.1  1.0 1577.7  377.9 83.5 19.6 83.9   2.47
@@ -39,7 +97,25 @@
     Summary:
     System:   2.47 Watts on average with standard deviation 0.37
 
-## 1 USB-C: 2.14W, 2.39W, 3.80W
+## screen off, 1 USB-C
+
+### no radios
+
+This is the same test result as the "screen off, no radios, 1 USB-C"
+test below.
+
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Average   0.1   0.0   0.1  99.7   0.0  1.0 1044.4  271.7 81.2 19.6 81.6   2.09
+     GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1037.3  270.8 80.2 18.4 80.6   2.09
+      StdDev   0.0   0.0   0.0   0.1   0.0  0.0  126.1   22.7 15.5  9.2 15.4   0.07
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Minimum   0.1   0.0   0.1  99.4   0.0  1.0  813.5  239.0 70.0 16.0 71.0   1.96
+     Maximum   0.2   0.2   0.2  99.8   0.1  1.0 1460.2  349.1 153.0 56.0 153.0   2.23
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+    Summary:
+    System:   2.09 Watts on average with standard deviation 0.07
+
+### radios
 
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.2   0.0   0.1  99.6   0.0  1.0 1504.4  356.2 80.9 18.4 81.0   2.39
@@ -52,8 +128,26 @@
     Summary:
     System:   2.39 Watts on average with standard deviation 0.41
 
-## 2 USB-C: 2.14W, 2.53W, 4.56W
+## screen off, 2 USB-C
+
+### no radios
 
+This is the same test result as the "screen off, no radios, 2 USB-C"
+test below.
+
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Average   0.1   0.0   0.1  99.7   0.0  1.1 1100.6  282.5 86.9 21.7 86.8   2.09
+     GeoMean   0.1   0.0   0.1  99.7   0.0  1.1 1096.0  281.3 84.7 19.6 84.7   2.09
+      StdDev   0.0   0.0   0.0   0.1   0.0  0.4  102.6   25.9 24.1 13.5 23.9   0.05
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Minimum   0.1   0.0   0.1  99.5   0.0  1.0  900.8  246.1 73.0 16.0 73.0   1.99
+     Maximum   0.2   0.1   0.2  99.8   0.1  3.0 1335.8  365.8 188.0 80.0 187.0   2.19
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+    Summary:
+    System:   2.09 Watts on average with standard deviation 0.05
+
+### radios
+ 
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.2   0.0   0.1  99.5   0.0  1.1 1608.6  388.2 87.4 20.5 87.0   2.53
      GeoMean   0.2   0.0   0.1  99.5   0.0  1.0 1568.0  364.4 84.5 18.8 84.3   2.46
@@ -65,8 +159,8 @@
     Summary:
     System:   2.53 Watts on average with standard deviation 0.68
 
-## 1 USB-A
-
+## scren off, 1 USB-A
+ 
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
      Average   0.2   0.0   0.1  99.7   0.0  1.0 1425.1  326.4 78.9 17.4 79.2   2.25
      GeoMean   0.2   0.0   0.1  99.7   0.0  1.0 1417.3  323.9 78.9 17.2 79.1   2.25
@@ -78,33 +172,165 @@
     Summary:
     System:   2.25 Watts on average with standard deviation 0.10
 
-## 1 USB-A, bluetooth off, wifi off
+# screen off, no radios tests
+
+## no modules: 2.16W, 2.47W, 3.56W
+
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Average   0.2   0.0   0.1  99.7   0.0  1.0 1116.0  331.7 82.9 19.7 82.7   2.24
+     GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1100.8  305.4 81.8 18.5 81.7   2.22
+      StdDev   0.1   0.0   0.0   0.1   0.0  0.0  208.8  225.2 15.4  9.3 15.1   0.33
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Minimum   0.1   0.0   0.1  99.1   0.0  1.0  849.8  231.8 72.0 16.0 72.0   2.06
+     Maximum   0.6   0.2   0.2  99.8   0.1  1.0 2038.4 1535.4 151.0 56.0 151.0   3.81
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+    Summary:
+    System:   2.24 Watts on average with standard deviation 0.33
+
+## 1 USB-C: 2.14W, 2.39W, 3.80W
+
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Average   0.1   0.0   0.1  99.7   0.0  1.0 1044.4  271.7 81.2 19.6 81.6   2.09
+     GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1037.3  270.8 80.2 18.4 80.6   2.09
+      StdDev   0.0   0.0   0.0   0.1   0.0  0.0  126.1   22.7 15.5  9.2 15.4   0.07
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Minimum   0.1   0.0   0.1  99.4   0.0  1.0  813.5  239.0 70.0 16.0 71.0   1.96
+     Maximum   0.2   0.2   0.2  99.8   0.1  1.0 1460.2  349.1 153.0 56.0 153.0   2.23
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+    Summary:
+    System:   2.09 Watts on average with standard deviation 0.07
 
-I forgot to test with/without bluetooth, so I'm doing a detour here.
+## 2 USB-C: 2.14W, 2.53W, 4.56W
 
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
-     Average   0.1   0.0   0.1  99.7   0.0  1.0 1062.6  282.2 78.6 17.3 78.7   2.09
-     GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1058.7  281.5 78.5 17.1 78.6   2.08
-      StdDev   0.0   0.0   0.0   0.0   0.0  0.2   90.2   19.5  4.1  2.6  4.1   0.05
+     Average   0.1   0.0   0.1  99.7   0.0  1.1 1100.6  282.5 86.9 21.7 86.8   2.09
+     GeoMean   0.1   0.0   0.1  99.7   0.0  1.1 1096.0  281.3 84.7 19.6 84.7   2.09
+      StdDev   0.0   0.0   0.0   0.1   0.0  0.4  102.6   25.9 24.1 13.5 23.9   0.05
     -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
-     Minimum   0.1   0.0   0.1  99.6   0.0  1.0  902.0  246.4 74.0 16.0 74.0   1.96

(Diff truncated)
first batch of results, skewed because radios were on
diff --git a/hardware/laptop/framework-12th-gen/powerstat.md b/hardware/laptop/framework-12th-gen/powerstat.md
index d7ade3c4..deb3c032 100644
--- a/hardware/laptop/framework-12th-gen/powerstat.md
+++ b/hardware/laptop/framework-12th-gen/powerstat.md
@@ -1,19 +1,102 @@
-# 100% brightness, no modules
+# 100% brightness, no modules: 4.58W, 4.70W, 4.88W
 
-# minimum brightness, no modules
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Average   0.1   0.0   0.1  99.7   0.0  1.1 1073.7  276.0 83.3 20.5 84.3   4.70
+     GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1067.2  275.0 81.8 18.9 82.7   4.70
+      StdDev   0.0   0.0   0.0   0.1   0.0  0.4  117.1   23.2 20.3 12.3 20.9   0.07
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Minimum   0.1   0.0   0.1  99.5   0.0  1.0  863.2  233.8 72.0 16.0 72.0   4.58
+     Maximum   0.2   0.2   0.2  99.8   0.1  3.0 1261.5  314.4 186.0 80.0 185.0   4.88
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+    Summary:
+    System:   4.70 Watts on average with standard deviation 0.07
+
+# minimum brightness, no modules, 2.30W, 2.49W, 3.71W
+
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Average   0.2   0.0   0.1  99.6   0.0  1.0 1540.7  361.6 82.8 18.6 83.1   2.49
+     GeoMean   0.2   0.0   0.1  99.6   0.0  1.0 1527.3  351.4 82.0 17.8 82.3   2.48
+      StdDev   0.0   0.1   0.0   0.1   0.0  0.2  220.0  103.1 14.4  7.4 13.9   0.30
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Minimum   0.1   0.0   0.1  99.2   0.0  1.0 1303.9  282.0 75.0 16.0 76.0   2.30
+     Maximum   0.3   0.3   0.3  99.7   0.1  2.0 2219.0  742.5 158.0 56.0 156.0   3.71
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+    Summary:
+    System:   2.49 Watts on average with standard deviation 0.30
 
 # 0% brightness...
 
-## no modules
+## no modules: 2.16W, 2.47W, 3.56W
+
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Average   0.2   0.0   0.1  99.6   0.1  1.0 1577.7  377.9 83.5 19.6 83.9   2.47
+     GeoMean   0.2   0.0   0.1  99.6   0.0  1.0 1561.8  367.3 82.5 18.5 82.9   2.44
+      StdDev   0.0   0.1   0.0   0.1   0.0  0.2  235.6   99.5 15.6  8.9 15.5   0.37
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Minimum   0.1   0.0   0.1  99.2   0.0  1.0 1308.0  287.6 73.0 16.0 74.0   2.16
+     Maximum   0.3   0.3   0.3  99.8   0.1  2.0 2201.1  681.6 157.0 56.0 156.0   3.56
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+    Summary:
+    System:   2.47 Watts on average with standard deviation 0.37
 
-## 1 USB-C
+## 1 USB-C: 2.14W, 2.39W, 3.80W
 
-## 2 USB-C
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Average   0.2   0.0   0.1  99.6   0.0  1.0 1504.4  356.2 80.9 18.4 81.0   2.39
+     GeoMean   0.2   0.0   0.1  99.6   0.0  1.0 1485.4  344.7 80.5 17.7 80.6   2.36
+      StdDev   0.0   0.1   0.1   0.2   0.0  0.2  273.3  113.8  8.9  6.9  9.0   0.41
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Minimum   0.1   0.0   0.1  98.9   0.0  1.0 1237.9  276.5 75.0 16.0 75.0   2.14
+     Maximum   0.2   0.4   0.4  99.8   0.2  2.0 2549.2  797.7 125.0 53.0 126.0   3.80
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+    Summary:
+    System:   2.39 Watts on average with standard deviation 0.41
+
+## 2 USB-C: 2.14W, 2.53W, 4.56W
+
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Average   0.2   0.0   0.1  99.5   0.0  1.1 1608.6  388.2 87.4 20.5 87.0   2.53
+     GeoMean   0.2   0.0   0.1  99.5   0.0  1.0 1568.0  364.4 84.5 18.8 84.3   2.46
+      StdDev   0.4   0.1   0.1   0.5   0.0  0.2  421.7  176.0 32.5 12.6 30.5   0.68
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Minimum   0.1   0.0   0.1  96.9   0.0  1.0 1127.3  265.6 72.0 16.0 72.0   2.14
+     Maximum   2.2   0.4   0.6  99.8   0.1  2.0 3366.0 1150.2 258.0 83.0 247.0   4.56
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+    Summary:
+    System:   2.53 Watts on average with standard deviation 0.68
 
 ## 1 USB-A
 
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Average   0.2   0.0   0.1  99.7   0.0  1.0 1425.1  326.4 78.9 17.4 79.2   2.25
+     GeoMean   0.2   0.0   0.1  99.7   0.0  1.0 1417.3  323.9 78.9 17.2 79.1   2.25
+      StdDev   0.0   0.0   0.0   0.1   0.0  0.0  155.5   47.4  3.5  2.7  3.2   0.10
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Minimum   0.1   0.0   0.1  99.4   0.0  1.0 1209.4  285.5 74.0 16.0 74.0   2.13
+     Maximum   0.2   0.2   0.2  99.7   0.1  1.0 2006.0  564.1 87.0 23.0 87.0   2.68
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+    Summary:
+    System:   2.25 Watts on average with standard deviation 0.10
+
+## 1 USB-A, bluetooth off, wifi off
+
+I forgot to test with/without bluetooth, so I'm doing a detour here.
+
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Average   0.1   0.0   0.1  99.7   0.0  1.0 1062.6  282.2 78.6 17.3 78.7   2.09
+     GeoMean   0.1   0.0   0.1  99.7   0.0  1.0 1058.7  281.5 78.5 17.1 78.6   2.08
+      StdDev   0.0   0.0   0.0   0.0   0.0  0.2   90.2   19.5  4.1  2.6  4.1   0.05
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Minimum   0.1   0.0   0.1  99.6   0.0  1.0  902.0  246.4 74.0 16.0 74.0   1.96
+     Maximum   0.2   0.0   0.2  99.8   0.1  2.0 1256.0  322.6 89.0 23.0 89.0   2.18
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+    Summary:
+    System:   2.09 Watts on average with standard deviation 0.05
+
+
 ## 2 USB-A
 
+
 ## 3 USB-A
 
 ## 1TB SSD

expliciter que l'article est pas passé au dewors
diff --git a/blog/2022-09-25-pourquoi-nationaliser.md b/blog/2022-09-25-pourquoi-nationaliser.md
index 69319494..78640f27 100644
--- a/blog/2022-09-25-pourquoi-nationaliser.md
+++ b/blog/2022-09-25-pourquoi-nationaliser.md
@@ -165,4 +165,6 @@ grand-chose à la maison.
 [coupures de services nuagiques en Grande-Bretagne]: https://gizmodo.com/google-oracle-cloud-heatwave-europe-1849199124
 [london]: https://gizmodo.com/data-centers-london-tech-electric-grid-1849342150
 
-[[!tag analyse bell histoire "network neutrality" internet politique canada québec]]
+> Cet article a été [[refusé au Devoir|tag/ledevoir-rejet]].
+
+[[!tag analyse bell histoire "network neutrality" internet politique canada québec ledevoir-rejet]]

publish article about net neutrality, in french
diff --git a/blog/2022-09-25-pourquoi-nationaliser.md b/blog/2022-09-25-pourquoi-nationaliser.md
index 6e3958a4..69319494 100644
--- a/blog/2022-09-25-pourquoi-nationaliser.md
+++ b/blog/2022-09-25-pourquoi-nationaliser.md
@@ -165,4 +165,4 @@ grand-chose à la maison.
 [coupures de services nuagiques en Grande-Bretagne]: https://gizmodo.com/google-oracle-cloud-heatwave-europe-1849199124
 [london]: https://gizmodo.com/data-centers-london-tech-electric-grid-1849342150
 
-[[!tag draft]]
+[[!tag analyse bell histoire "network neutrality" internet politique canada québec]]

lay down a framework for testing all modules
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index c6e0d66c..857e1a45 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -629,6 +629,10 @@ alarming as your banging the keyboard to bring it back to life.
 
 TODO: redo those tests with all expansion cards unplugged.
 
+### Detailed power usage tests
+
+See [[powerstat]].
+
 ## Expansion ports
 
 I ordered a total of 10 expansion ports. I have actually not used all
diff --git a/hardware/laptop/framework-12th-gen/powerstat.md b/hardware/laptop/framework-12th-gen/powerstat.md
new file mode 100644
index 00000000..d7ade3c4
--- /dev/null
+++ b/hardware/laptop/framework-12th-gen/powerstat.md
@@ -0,0 +1,27 @@
+# 100% brightness, no modules
+
+# minimum brightness, no modules
+
+# 0% brightness...
+
+## no modules
+
+## 1 USB-C
+
+## 2 USB-C
+
+## 1 USB-A
+
+## 2 USB-A
+
+## 3 USB-A
+
+## 1TB SSD
+
+## 1 MicroSD
+
+## 1 HDMI
+
+## 2 HDMI
+
+## 1 DisplayPort

links from the hn discussion
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index d954b707..c6e0d66c 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -24,8 +24,8 @@ amazing machine.
 
 On the downside, it has serious power management issues. There's a lot
 of proprietary firmware required (WiFi, Bluetooth, some graphics) and
-the Framework ships with a proprietary BIOS, with currently no
-Coreboot support. Expect to need the latest kernel, firmware, and
+the Framework ships with a proprietary BIOS, with currently [no
+Coreboot support](https://news.ycombinator.com/item?id=32926736). Expect to need the latest kernel, firmware, and
 hacking around a bunch of things to get resolution and keybindings to
 get the laptop to work right. Don't expect week-long suspend, or full
 day battery.
@@ -616,8 +616,8 @@ my test bench is not quite good enough.
 
 In any case, it feels far from a normal power usage, and I wish this would be
 something the Framework project would really prioritize at this
-point. There *is* some hope that the [Chromebook edition](https://frame.work/at/en/blog/introducing-the-framework-laptop-chromebook-edition) —
-specifically designed with a specification of 14 days standby time —
+point. There *is* [some hope](https://news.ycombinator.com/item?id=32930511) that the [Chromebook edition](https://frame.work/at/en/blog/introducing-the-framework-laptop-chromebook-edition) —
+specifically designed with a [specification of 14 days standby time](https://news.ycombinator.com/item?id=32927094) —
 could bring some firmware improvements back down to the normal
 line. And, here again, it's possible my system configuration might be
 screwing with standby mode.

lots more data about power usage, more TODOs
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index ed1d515c..d954b707 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -156,6 +156,11 @@ the laptop.
    keyboard and touchpad, according to [Linux After Dark][linux-after-dark-framework] ; more
    critical review from an[OpenBSD developer](https://jcs.org/2021/08/06/framework)
 
+ * the EC (Embedded Controller) is [open source](https://github.com/FrameworkComputer/EmbeddedController) so of course
+   people are [hacking at it](https://github.com/lhl/linuxlaptops/wiki/2022-Framework-Laptop-DIY-Edition-12th-Gen-Intel-Batch-1#ectool), [some documentation on what's
+   possible](https://www.howett.net/posts/2021-12-framework-ec/) (e.g. changing led colors, fan curves, etc), [see
+   also](https://github.com/lhl/linuxlaptops/wiki/2022-Framework-Laptop-DIY-Edition-12th-Gen-Intel-Batch-1#ectool)
+
 ## Cons
 
  * the 11th gen is out of stock, except for the higher-end CPUs, which
@@ -422,16 +427,18 @@ is nicer than my old Thinkpad X220 (20 minutes!) but really, it's not
 good for a new generation laptop.
 
 I was hoping the 12th generation Intel chipset would improve things
-compared to the previous one. But it seems either I'm missing
-something important in the stack, or that upgrade doesn't live up to
-its promises.
+compared to the previous one. And while it's possible it *is* the case
+(after all, I don't have a 11th gen Framework to compare with), it
+does feel a little disappointing to see that 7 hour estimate on a
+brand new laptop.
 
 (Note that those are estimates from my status bar, not wall clock
 measurements. They should still be comparable between the Purism and
 Framework, that said.)
 
 The battery life is certainly not up to, say, Dell XPS 13, Thinpad X1,
-and of course not the Apple M1.
+and of course not the Apple M1, where I would expect 10+ hours of
+battery life out of the box.
 
 ## Power management
 
@@ -439,16 +446,38 @@ Compared to the Purism Librem 13v4, the *ongoing* power usage seems to
 be slightly better. An anecdotal metric is that the Purism would take
 800mA idle, while the more powerful Framework manages a little over
 500mA as I'm typing this, fluctuating between 450 and 600mA. That is
-without any active expansion card, except the storage. It could be
-better.
+without any active expansion card, except the storage. Those numbers
+come from the output of `tlp-stat -b` and, unfortunately, the "ampere"
+unit makes it quite hard to compare those, because voltage is not
+necessarily the same.
+
+### Background on CPU architecture
 
 The power problems were already present in the 11th gen, according to
-[this report from Linux After Dark][linux-after-dark-framework], so this is not a new
-problem. It's possible the Linux kernel might be lagging, as the 12th
-gen Intel chips use a "big-little" design that could require scheduler
-changes to effect proper power savings. The [firmware updates for
-various chipsets](https://news.ycombinator.com/item?id=31434021) are supposed to improve things eventually, but
-I'll believe it when I see it.
+[this report from Linux After Dark][linux-after-dark-framework], so the issues with power
+management on the Framework are not new.
+
+But the 12th generation Intel CPU (AKA "[Alder Lake](https://en.wikipedia.org/wiki/Alder_Lake)") is a
+[big-little architecture](https://en.wikipedia.org/wiki/Heterogeneous_computing) with "power-saving" and "performance"
+cores. There used to be [performance problems introduced by the
+scheduler in Linux 5.16](https://www.theregister.com/2021/12/01/linux_5_16_alder_lake/) but those were eventually [fixed in
+5.18](https://linux.slashdot.org/story/22/02/12/2237234/intel-thread-director-is-headed-to-linux-for-a-major-boost-in-alder-lake-performance), which uses Intel's hardware as an "intelligent, low-latency
+hardware-assisted scheduler". According [to Phoronix](https://www.phoronix.com/review/linux-519-alderlakep), the 5.19
+release improved the power saving, at the cost of some penalty
+cost. There were also [patch series](https://www.phoronix.com/news/Cluster-Scheduling-Configure) to make the scheduler
+configurable, but it doesn't look those have been merged as of 5.19.
+
+All this to say that the 12gen Intel line shipped with this Framework
+series is supposed to have better power management at the core level,
+with power-saving cores. And Linux has had the scheduler changes to
+make use of this, so this should not be the source of power management
+problems on my laptop, quite the opposite.
+
+Also note that the [firmware updates for various chipsets](https://news.ycombinator.com/item?id=31434021) are
+supposed to improve things eventually, but I'll believe it when I see
+it.
+
+### Attempts at improving power usage
 
 I did try to follow some of the tips in [this forum post](https://community.frame.work/t/linux-battery-life-tuning/6665). The
 tricks `powertop --auto-tune` and `tlp`'s
@@ -467,6 +496,14 @@ power unless proper power management is enabled (see below). After
 tweaking this, I did manage to get down to around 7W power usage in
 powertop.
 
+Expansion cards actually *do* take up power, and so does the screen,
+obviously. The fully-lit screen takes a solid 2-3W of power compared
+to the fully dimmed screen. When removing *all* expansion cards and
+making the laptop idle, I can spin it down to 4 watts power usage at
+the moment.
+
+### Caveats
+
 This could be a problem with my desktop configuration: I have this
 silly status bar that updates every second and probably causes
 redraws... The CPU certainly doesn't spin down below 1GHz. Also note
@@ -480,7 +517,7 @@ Beyond my desktop configuration, this could, of course, be a
 Debian-specific problem; your favorite distribution might be better at
 power management.
 
-## Standby battery usage
+### Standby battery usage
 
 I wrote some [[quick hack to evaluate how much power is used during
 sleep|blog/2022-09-28-suspend-battery-use]]. Apparently, this is one
@@ -535,6 +572,13 @@ Note that this was done with the following expansion cards:
 Preliminary tests without the hub (over one minute) show that it
 doesn't significantly affect this power consumption (300mA).
 
+TODO: results in the power managemnet section (particularly with
+USB-A) show that this could actually be a problem. redo suspend tests
+without any expansion ports.
+
+TOOD: consider [suspend-then-hibernate](https://wiki.archlinux.org/title/Power_management/Suspend_and_hibernate)
+TODO: consider [suspend USB devices](https://community.frame.work/t/guide-automatically-disable-usb-devices-for-battery-savings/20392)
+
 [This guide](https://guides.frame.work/Guide/Fedora+36+Installation+on+the+Framework+Laptop/108?lang=en#s655) also suggests booting with `nvme.noacpi=1` but this
 still gives me about 5mAh/min (or 300mA). 
 
@@ -566,7 +610,6 @@ A longer test:
     oct 01 09:22:56 angela systemd-sleep[62978]: /sys/class/power_supply/BAT1/charge_now                     =   3327 [mAh]
     oct 01 12:47:35 angela systemd-sleep[63219]: /sys/class/power_supply/BAT1/charge_now                     =   3147 [mAh]
 
-
 That's 180mAh in about 3.5h, 52mA! Now at 66h, or almost 3 days. Not
 sure why I am seeing fluctuations in those tests, it's possible that
 my test bench is not quite good enough.
@@ -584,6 +627,8 @@ disruptive than regular sleep. As you can see by the timing, it took
 more than 10 seconds for the laptop to resume, which feels a little
 alarming as your banging the keyboard to bring it back to life.
 
+TODO: redo those tests with all expansion cards unplugged.
+
 ## Expansion ports
 
 I ordered a total of 10 expansion ports. I have actually not used all
@@ -612,20 +657,91 @@ work for normal SD cards, which would be more broadly compatible
 anyways (because you can have a MicroSD to SD card adapter, but I have
 never heard of the reverse).
 
+(Update: someone actually [found a SD card reader that fits](https://community.frame.work/t/i-found-an-sd-card-reader-that-fits/9910) and
+then [someone else managed to cram it in a 3D printed case](https://community.frame.work/t/i-found-an-sd-card-reader-that-fits/9910/18?u=anarcat). This
+is bonkers.)
+
 Still, I really like that idea that I can carry all those little
 adapters in a pouch when I travel and can basically do anything I
 want.
 
-Interestingly, I could *not* reproduce the power usage of the
-expansion ports when idle. I tried plugging in the HDMI and
-DisplayPort adapters, and none of them raised the power usage above
-what the normal CPU throttling would fluctuate around
-(600-750mA). Surprisingly, the 1TB disk also doesn't seem to drain the
-battery either when idle, or at least not above a few mA (say
-30-50mA?), same with the MicroSD card reader.
+### Power usage
 
-I suspect some firmware updates have actually fixed the issues with
-the expansion ports power savings.
+Interestingly, I could *not* reproduce the power usage of the
+expansion ports when idle, at least not the massive 500-1000mW power
+drains I have seen reported elsewhere.
+
+I *did* see a slight power drain on the USB-A connectors,
+surprisingly. It looks like USB-A connectors have this fundamental
+flaw that they necessarily draw *some* powers because they lack the
+power negociation features of USB-C. At least [according to this
+post](https://community.frame.work/t/12th-gen-battery-questions-on-linux/20729/24?u=anarcat):
+
+> It seems the USB A must have power going to it all the time, that
+> the old USB 2 and 3 protocols, the USB C only provides power when
+> there is a connection. Old versus new.
+
+And this is something I can reproduce with:
+
+    sudo powerstat -d 30 1 600
+
+Without the USB-A card:
+
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Average   0.3   0.0   0.2  99.5   0.0  1.0 1878.5  427.4  8.3  1.8  8.3   5.02
+     GeoMean   0.2   0.0   0.0  99.5   0.0  1.0 1802.4  411.7  7.9  1.4  8.0   5.01
+      StdDev   0.1   0.0   0.1   0.2   0.1  0.2  678.9  140.2  2.7  1.5  2.7   0.12
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Minimum   0.1   0.0   0.0  98.8   0.0  1.0 1317.0  289.0  6.0  1.0  6.0   4.87
+     Maximum   0.7   0.1   0.6  99.7   0.3  2.0 5123.0 1105.0 16.0  8.0 16.0   5.26
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+    Summary:
+    System:   5.02 Watts on average with standard deviation 0.12
+
+With:
+
+    -------- ----- ----- ----- ----- ----- ---- ------ ------ ---- ---- ---- ------
+     Average   0.4   0.0   0.2  99.3   0.1  1.1 2329.1  525.4 10.0  2.8 10.0   6.60
+     GeoMean   0.3   0.0   0.1  99.3   0.0  1.0 2098.1  495.0  8.7  1.7  8.9   6.59

(Diff truncated)
more wayland software
diff --git a/software/desktop/wayland.md b/software/desktop/wayland.md
index a829270b..dfb2689e 100644
--- a/software/desktop/wayland.md
+++ b/software/desktop/wayland.md
@@ -274,7 +274,10 @@ need to:
  * wallpaper: currently using feh, will need a replacement,
    [swaybg](https://github.com/swaywm/swaybg) might just be enough
  * notifications: currently using dunst in some places, could
-   generalize, not a blocker
+   generalize, not a blocker, [salut](https://gitlab.com/snakedye/salut/) a possible alternative (not
+   in Debian)
+ * window switcher: currently using a hacked up `i3-focus` script,
+   will probably need porting, [swayr](https://sr.ht/~tsdh/swayr/) an option, not in Debian
  * PDF viewer: could just switch to zatura/mupdf permanently, see also
    [[calibre]]
 

hidpi crap
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 687c8d4a..ed1d515c 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -906,17 +906,26 @@ This will make the console and grub fonts more readable:
 
 Adding this to your Xresources will make everything look much bigger:
 
-    Xft.dpi: 140
+    ! 1.5*96
+    Xft.dpi: 144
+
+It my experience it also makes things look a little fuzzier, which is
+frustrating because you have this awesome monitor but everything looks
+out of focus.
+
+Apparently, some of this can also help:
+
+    ! These might also be useful depending on your monitor and personal preference:
     Xft.autohint: 0
-    Xft.lcdfilter: lcddefault
-    Xft.hintstyle: hintfull
+    Xft.lcdfilter:  lcddefault
+    Xft.hintstyle:  hintfull
     Xft.hinting: 1
     Xft.antialias: 1
     Xft.rgba: rgb
 
-It my experience it also makes things look a little fuzzier. And I
-don't find the font size to be *that* bad so I'm experimenting with
-the normal size right now.
+The [Debian Wiki has a page on HiDPI](https://wiki.debian.org/HiDPI), but it's not as good as the
+[Arch Wiki](https://wiki.archlinux.org/title/HiDPI), where the above blurb comes from. I am not using the
+latter because I suspect it's causing some of the "fuzziness".
 
 TODO: find the equivalent of this GNOME hack in i3? (`gsettings set org.gnome.mutter experimental-features "['scale-monitor-framebuffer']"`): https://guides.frame.work/Guide/Fedora+36+Installation+on+the+Framework+Laptop/108?lang=en#s655
 

gpu stuff
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 7828f92b..687c8d4a 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -433,17 +433,14 @@ Framework, that said.)
 The battery life is certainly not up to, say, Dell XPS 13, Thinpad X1,
 and of course not the Apple M1.
 
-TODO: this could be a GPU issue, see below.
-
 ## Power management
 
 Compared to the Purism Librem 13v4, the *ongoing* power usage seems to
 be slightly better. An anecdotal metric is that the Purism would take
 800mA idle, while the more powerful Framework manages a little over
-600mA as I'm typing this, fluctuating between 600 and 650mA. That is
-without any active expansion card, except the storage. Considering how
-much more modern the Framework is, however, this is a little
-disappointing as well.
+500mA as I'm typing this, fluctuating between 450 and 600mA. That is
+without any active expansion card, except the storage. It could be
+better.
 
 The power problems were already present in the 11th gen, according to
 [this report from Linux After Dark][linux-after-dark-framework], so this is not a new
@@ -465,6 +462,11 @@ even `C9`, `C10`) in powertop, but I seem to be stock at
 in C7 or maybe C6. But the next column over *does* show many CPUs in
 C10 states...
 
+As it turns out, the graphics card actually takes up a good chunk of
+power unless proper power management is enabled (see below). After
+tweaking this, I did manage to get down to around 7W power usage in
+powertop.
+
 This could be a problem with my desktop configuration: I have this
 silly status bar that updates every second and probably causes
 redraws... The CPU certainly doesn't spin down below 1GHz. Also note
@@ -474,14 +476,10 @@ up unreasonable amount of power on their own (hello, 1W/electron,
 sheesh). (Syncthing and containerd (Docker!) also each take a good 500mW
 just sitting there.)
 
-But even with everything mostly idle (including the status bar), I
-don't really go below 8.5W. This could, of course, be a
+Beyond my desktop configuration, this could, of course, be a
 Debian-specific problem; your favorite distribution might be better at
 power management.
 
-TODO: turns out that firmware issue (below) matters, try again with
-the firmware loaded.
-
 ## Standby battery usage
 
 I wrote some [[quick hack to evaluate how much power is used during
@@ -561,8 +559,17 @@ Here's another test:
     sep 30 22:31:30 angela systemd-sleep[32516]: /sys/class/power_supply/BAT1/charge_now                     =   1613 [mAh]
 
 ... better! 6 mAh in about 6 minutes, works out to 63.5mA, so more
-than two days standby. Not sure why I am seeing fluctuations in those
-tests, it's possible that my test bench is not quite good enough.
+than two days standby.
+
+A longer test:
+
+    oct 01 09:22:56 angela systemd-sleep[62978]: /sys/class/power_supply/BAT1/charge_now                     =   3327 [mAh]
+    oct 01 12:47:35 angela systemd-sleep[63219]: /sys/class/power_supply/BAT1/charge_now                     =   3147 [mAh]
+
+
+That's 180mAh in about 3.5h, 52mA! Now at 66h, or almost 3 days. Not
+sure why I am seeing fluctuations in those tests, it's possible that
+my test bench is not quite good enough.
 
 In any case, it feels far from a normal power usage, and I wish this would be
 something the Framework project would really prioritize at this
@@ -597,6 +604,14 @@ nowhere to plug my Yubikey. So if this is going to be my daily driver,
 with a dual monitor setup, I will need a dock, which means more crap
 firmware and uncertainty, which isn't great.
 
+I can't wait to see more expansion ports produced. There's a [ethernet
+expansion card](https://frame.work/ca/en/products/ethernet-expansion-card) coming Real Soon -- you can order in some regions
+already -- and I would very much like to see a proper SD-card
+reader. There's a *MicroSD* card reader, but that obviously doesn't
+work for normal SD cards, which would be more broadly compatible
+anyways (because you can have a MicroSD to SD card adapter, but I have
+never heard of the reverse).
+
 Still, I really like that idea that I can carry all those little
 adapters in a pouch when I travel and can basically do anything I
 want.
@@ -694,14 +709,14 @@ The framework does need proprietary firmware to operate. Specifically:
    firmware, normally shipped in the [[!debpkg firmware-misc-nonfree]]
    but currently missing from the package
 
-<span /><div class="warning">
+<span /><div class="important">
 Note that, at the time of writing, the [latest i915 firmware from
 linux-firmware](https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/tree/i915?id=51fff4e69b4554dd3fee21e3c55a0f94937293e3) has a *serious* bug where loading *all* the
 accessible firmware results in noticeable — I estimate 200-500ms — lag
 between the keyboard (not the mouse!) and the display. Symptoms also
 include tearing and shearing of windows, it's pretty nasty.
 
-The workaround is to delete the two affected firmware files:
+One workaround is to delete the two affected firmware files:
 
     cd /lib/firmware && rm adlp_guc_70.1.1.bin adlp_guc_69.0.3.bin
     update-initramfs -u
@@ -712,11 +727,38 @@ it means the problematic firmware is disabled:
     W: Possible missing firmware /lib/firmware/i915/adlp_guc_69.0.3.bin for module i915
     W: Possible missing firmware /lib/firmware/i915/adlp_guc_70.1.1.bin for module i915
 
-Thanks to [EmanueleRocca](https://wiki.debian.org/EmanueleRocca) for figuring that one out. See also [this
-discussion about power management on the Framework forum](https://community.frame.work/t/12th-gen-power-management-on-linux/21330).
+But then it also means that critical firmware isn't loaded, which
+means, among other things, a higher battery drain. I was able to move
+from 8.5-10W down to the 7W range after making the firmware work
+properly. This is also after turning the backlight all the way down,
+as that takes a solid 2-3W when in full blast.
+
+The trick is to use some compositing manager. I ended up using
+[[!debpkg compton]] with the following systemd unit:
+
+    [Unit]
+    Description=start compositing manager
+    PartOf=graphical-session.target
+    ConditionHost=angela
+
+    [Service]
+    Type=exec
+    ExecStart=compton --show-all-xerrors --backend glx --vsync opengl-swc
+    Restart=on-failure
+
+    [Install]
+    RequiredBy=graphical-session.target
+
+`compton` is orphaned however, so you might be tempted to use
+[[!debpkg picom]] instead, but in my experience the latter uses much
+more power (1-2W extra).
 
-TODO: review this. apparently this might be solveable with a
-composition manager, eg. compiz. see https://wiki.debian.org/InstallingDebianOn/FrameWork/12thGen?action=diff&rev1=16&rev2=17
+It's also possible that a Wayland environment might do the right thing
+here as well, but I'm [software/desktop/wayland|not switching to
+wayland just yet]].
+
+Thanks to [EmanueleRocca](https://wiki.debian.org/EmanueleRocca) for figuring all that out. See also [this
+discussion about power management on the Framework forum](https://community.frame.work/t/12th-gen-power-management-on-linux/21330).
 </div>
 
 <span /><div class="note">
@@ -751,11 +793,53 @@ the package installed, I get those errors in dmesg:
     [   19.544530] iwlwifi 0000:a6:00.0: loaded firmware version 66.55c64978.0 ty-a0-gf-a0-66.ucode op_mode iwlmvm
 
 *Some* of those are available in the latest upstream firmware package
-(`iwlwifi-ty-a0-gf-a0-71.ucode`, `-68`, and `-67`), but not all. It's
-unclear what those do or don't, as the WiFi seems to work well without
-them.
+(`iwlwifi-ty-a0-gf-a0-71.ucode`, `-68`, and `-67`), but not all
+(e.g. `iwlwifi-ty-a0-gf-a0-72.ucode` is missing) . It's unclear what
+those do or don't, as the WiFi seems to work well without them.
+
+I still copied them in from the latest linux-firmware package in the
+hope they would help with power management, but I did not notice a
+change after loading them.
 </div>
 
+## Graphics acceleration
+
+After loading the latest upstream firmware and setting up a
+compositing manager (`compton`, above), I tested the classic
+`glxgears`, and was slightly disappointed. Running in full screen, the
+gears were basically grinding to a halt:
+
+    Running synchronized to the vertical refresh.  The framerate should be
+    approximately the same as the monitor refresh rate.
+    137 frames in 5.1 seconds = 26.984 FPS
+    27 frames in 5.4 seconds =  5.022 FPS
+
+Ouch. 5FPS. But interestingly, once the window is in full screen, it
+does hit the refresh rate:
+
+    300 frames in 5.0 seconds = 60.000 FPS
+
+I'm not really a gamer and I'm not normally using any of that fancy
+graphics acceleration stuff (except maybe my browser does?). I did
+install [[!debpkg intel-gpu-tools]] for the `intel_gpu_top` command to
+confirm the GPU was engaged when doing those simulations. A nice
+find. Other useful diagnostic tools include `glxgears` and `glxinfo`
+(in [[!debpkg mesa-utils]]) and (`vainfo` in [[!debpkg vainfo]]).
+
+According to [this post](https://community.frame.work/t/linux-battery-life-tuning/6665), I also made sure to have those settings in
+my `about:config` in Firefox, or, in `user.js`:
+
+    user_pref("media.ffmpeg.vaapi.enabled", true);
+
+Note that the guide suggests many other settings to tweak, but those
+might actually be overkill, see [this comment and its parents](https://community.frame.work/t/linux-battery-life-tuning/6665/274).
+
+The guide also mentions installing the `intel-media-driver` package,
+but I could not find that in Debian.
+
+The Arch wiki has, as usual, an excellent reference on [hardware

(Diff truncated)
another suspend metric
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index ca5c90c0..7828f92b 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -555,7 +555,16 @@ power usage, and more than an order of magnitude more than the Purism
 laptop. It's also far from the 0.4% promised by upstream, which would
 be 14mA.
 
-So it's still far from a normal power usage, and I wish this would be
+Here's another test:
+
+    sep 30 22:25:50 angela systemd-sleep[32207]: /sys/class/power_supply/BAT1/charge_now                     =   1619 [mAh]
+    sep 30 22:31:30 angela systemd-sleep[32516]: /sys/class/power_supply/BAT1/charge_now                     =   1613 [mAh]
+
+... better! 6 mAh in about 6 minutes, works out to 63.5mA, so more
+than two days standby. Not sure why I am seeing fluctuations in those
+tests, it's possible that my test bench is not quite good enough.
+
+In any case, it feels far from a normal power usage, and I wish this would be
 something the Framework project would really prioritize at this
 point. There *is* some hope that the [Chromebook edition](https://frame.work/at/en/blog/introducing-the-framework-laptop-chromebook-edition) —
 specifically designed with a specification of 14 days standby time —

more clarifications, led can be dimmed
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index f42f8bc1..ca5c90c0 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -186,7 +186,8 @@ the laptop.
 
  * no space for a 2.5" drive
 
- * rather bright LED around power button
+ * rather bright LED around power button, but can be dimmed in the
+   BIOS (not low enough to my taste)
 
  * fan quiet when idle, but can be noisy when running
 
@@ -425,9 +426,15 @@ compared to the previous one. But it seems either I'm missing
 something important in the stack, or that upgrade doesn't live up to
 its promises.
 
+(Note that those are estimates from my status bar, not wall clock
+measurements. They should still be comparable between the Purism and
+Framework, that said.)
+
 The battery life is certainly not up to, say, Dell XPS 13, Thinpad X1,
 and of course not the Apple M1.
 
+TODO: this could be a GPU issue, see below.
+
 ## Power management
 
 Compared to the Purism Librem 13v4, the *ongoing* power usage seems to

cost notes
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 01327bc8..f42f8bc1 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -82,9 +82,10 @@ build will of course vary according to your needs.
 
 # Actual build
 
-This is the actual build I ordered.
+This is the actual build I ordered. Amounts in CAD. (1CAD =
+~0.75EUR/USD.)
 
-## base configuration
+## Base configuration
 
  * CPU: Intel® Core™ i5-1240P, 1079$
  * Memory: 16GB (1 x 16GB) DDR4-3200, 104$
@@ -103,7 +104,7 @@ This is the actual build I ordered.
  * 1 Storage – 1TB    $199
  * Sub-total: 384$
 
-## accessories
+## Accessories
 
  * Power Adapter - US/Canada    $64.00
 

mention this thing is fast as hell
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index b1650f3c..01327bc8 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -17,6 +17,11 @@ ports). Clearly there's been some good work done on industrial design,
 and it's the most repairable laptop I've had in years. Time will tell,
 but it looks sturdy enough to survive me many years as well.
 
+This is one of the most powerful devices I ever lay my hands on. I
+have managed, remotely, more powerful servers, but this is the fastest
+computer I have ever owned, and it fits in this tiny case. This is an
+amazing machine.
+
 On the downside, it has serious power management issues. There's a lot
 of proprietary firmware required (WiFi, Bluetooth, some graphics) and
 the Framework ships with a proprietary BIOS, with currently no

lag can be solved?
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index ed04b580..b1650f3c 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -466,6 +466,9 @@ don't really go below 8.5W. This could, of course, be a
 Debian-specific problem; your favorite distribution might be better at
 power management.
 
+TODO: turns out that firmware issue (below) matters, try again with
+the firmware loaded.
+
 ## Standby battery usage
 
 I wrote some [[quick hack to evaluate how much power is used during
@@ -689,6 +692,9 @@ it means the problematic firmware is disabled:
 
 Thanks to [EmanueleRocca](https://wiki.debian.org/EmanueleRocca) for figuring that one out. See also [this
 discussion about power management on the Framework forum](https://community.frame.work/t/12th-gen-power-management-on-linux/21330).
+
+TODO: review this. apparently this might be solveable with a
+composition manager, eg. compiz. see https://wiki.debian.org/InstallingDebianOn/FrameWork/12thGen?action=diff&rev1=16&rev2=17
 </div>
 
 <span /><div class="note">

fix typo, subtotals, thanks lelutin
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 0b977922..ed04b580 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -90,13 +90,13 @@ This is the actual build I ordered.
 
 ## Expansion Cards
 
- * 2 USB-C    $24.00
+ * 2 USB-C    $24
  * 3 USB-A $36
- * 2 HDMI    $50.00
+ * 2 HDMI    $50
  * 1 DP $50
- * 1 MicroSD    $25.00
- * 1 Storage – 1TB    $199.00
- * Sub-total: $199
+ * 1 MicroSD    $25
+ * 1 Storage – 1TB    $199
+ * Sub-total: 384$
 
 ## accessories
 
@@ -208,7 +208,7 @@ A breeze.
 
 ## Accessing the board
 
-The internals are access through five TorX screws, but there's a nice
+The internals are accessed through five TorX screws, but there's a nice
 screwdriver/spudger that works well enough. The screws actually hold in
 place so you can't even lose them.
 

finish a sentence
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index de144daa..0b977922 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -47,7 +47,8 @@ page.
 
 # Specifications
 
-Those are the specifications of the 12th 
+Those are the specifications of the 12th gen, in general terms. Your
+build will of course vary according to your needs.
 
  * CPU:  i5-1240P,  i7-1260P, or i7-1280P (Up to 4.4-4.8 GHz, 4+8 cores), Iris Xe graphics
  * Storage: 250-4000GB NVMe (or bring your own)

remove duplicate toc
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index ea6687a1..de144daa 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -1,5 +1,3 @@
-[[!toc levels=3]]
-
 The [Framework](https://frame.work) is a 13.5" laptop body with actually swappable
 parts, which makes it somewhat future-proof and certainly easily
 repairable, scoring an "exceedingly rare" [10/10 score from

all done
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index c7a19f85..ea6687a1 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -859,11 +859,6 @@ There was a related oddity when I had my Purism laptop shipped: it
 left from the west coast and seemed to enter on an endless, two week
 long road trip across the continental US.
 
-# Remaining work
-
- - TODO: install the extra 16GB from the purism laptop into the framework
- - TODO: other manual conf: adduser anarcat sudo
-
 # Other resources
 
  * [list of compatible USB-C docks](https://community.frame.work/t/usb-c-thunderbolt-dock-megathread/1460) but beware of the above
diff --git a/software/desktop/i3.conf b/software/desktop/i3.conf
index 09bcc8c9..5a97cd97 100644
--- a/software/desktop/i3.conf
+++ b/software/desktop/i3.conf
@@ -1,3 +1,6 @@
+#
+# TODO: this could be made public without duplication by moving into puppet, in /etc/i3/config
+#
 # i3 config file (v4)
 #
 # Please see http://i3wm.org/docs/userguide.html for a complete reference!

less todos
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 23fc4edd..c7a19f85 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -862,9 +862,7 @@ long road trip across the continental US.
 # Remaining work
 
  - TODO: install the extra 16GB from the purism laptop into the framework
- - TODO: consider throwing i3 config in puppet /etc/i3/config
  - TODO: other manual conf: adduser anarcat sudo
- - TODO: merge those tips in the Debian wiki page
 
 # Other resources
 

the hid hack works correctly
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 76d194ae..23fc4edd 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -749,15 +749,7 @@ In the meantime, the fancy functionality can be supposedly disabled with:
     echo 'blacklist hid_sensor_hub' | sudo tee /etc/modprobe.d/framework-als-blacklist.conf
 
 ... and a reboot. This solution is also [documented in the upstream
-guide](https://guides.frame.work/Guide/Fedora+36+Installation+on+the+Framework+Laptop/108?lang=en#s734). In my experience however, the module still loads then, I
-actually had to block other dependencies, like this:
-
-    blacklist hid_sensor_hub
-    blacklist hid_sensor_trigger
-    blacklist hid_sensor_iio_common
-    blacklist hid_sensor_als
-
-TODO: make sure this is all needed (reboot)
+guide](https://guides.frame.work/Guide/Fedora+36+Installation+on+the+Framework+Laptop/108?lang=en#s734).
 
 I bind those keys to `xbacklight` in i3, so out of the box I get this
 error:

finish editing the framework guide
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 8b8e3669..76d194ae 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -31,7 +31,11 @@ Finally, the expansion ports are nice, but there's only four of
 them. If you plan to have a two-monitor setup, you're likely going to
 need a dock.
 
-Read on for the detailed review.
+Read on for the detailed review. For context, I'm moving from the
+[[Purism Librem 13v4|hardware/purism-librem13v4]] because it
+[[basically exploded on me|blog/2022-08-25-one-dead-purism-laptop]]. I
+had, in the meantime, reverted back to an old ThinkPad X220, so I
+sometimes compare the Framework with that venerable laptop as well.
 
 [[!toc levels=5]]
 
@@ -152,12 +156,12 @@ the laptop.
  * the 11th gen is out of stock, except for the higher-end CPUs, which
    are much less affordable (700$+)
 
- * the 12th gen might have compatibility issues with Debian, followup
-   in the [DebianOn page](https://wiki.debian.org/InstallingDebianOn/FrameWork/12thGen), but basically: [brightness hotkeys](https://community.frame.work/t/12th-gen-not-sending-xf86monbrightnessup-down/20605/6),
-   [power management](https://community.frame.work/t/12th-gen-power-management-on-linux/21330), [wifi](https://community.frame.work/t/debian-11-gen12th-wifi-working/21799), the webcam is okay even though the chipset
-   is the [infamous alder lake](https://www.phoronix.com/news/Greg-KH-No-ADL-Webcam-Laptop) because it [does not have the fancy
-   camera](https://www.phoronix.com/forums/forum/linux-graphics-x-org-drivers/intel-linux/1340695-greg-kh-recommends-avoiding-alder-lake-laptops-intel-webcam-linux-driver-long-ways-out?p=1340968#post1340968); most issues currently seem solvable, and upstream is
-   working with mainline to get their shit working correct
+ * the 12th gen has compatibility issues with Debian, followup in the
+   [DebianOn page](https://wiki.debian.org/InstallingDebianOn/FrameWork/12thGen), but basically: [brightness hotkeys](https://community.frame.work/t/12th-gen-not-sending-xf86monbrightnessup-down/20605/6), [power
+   management](https://community.frame.work/t/12th-gen-power-management-on-linux/21330), [wifi](https://community.frame.work/t/debian-11-gen12th-wifi-working/21799), the webcam is okay even though the
+   chipset is the [infamous alder lake](https://www.phoronix.com/news/Greg-KH-No-ADL-Webcam-Laptop) because it [does not have
+   the fancy camera](https://www.phoronix.com/forums/forum/linux-graphics-x-org-drivers/intel-linux/1340695-greg-kh-recommends-avoiding-alder-lake-laptops-intel-webcam-linux-driver-long-ways-out?p=1340968#post1340968); most issues currently seem solvable, and
+   upstream is working with mainline to get their shit working
 
  * 12th gen might have [issues with thunderbolt docks](https://community.frame.work/t/usb-c-thunderbolt-dock-megathread/1460/238)
 
@@ -169,10 +173,11 @@ the laptop.
    September 2022 batch was generally on time, see [this spreadsheet
    for a crowdsourced effort to track those](https://docs.google.com/spreadsheets/d/10bhWkvOnaLhFG7RsZmb0uwKo4F8tBJWlTqXToUyIDX0/edit#gid=1658320056)
 
- * compared to my previous laptop (Purism Librem 13v4), it feels
-   strangely bulkier and heavier; it's actually *lighter* than the
-   purism (1.3kg vs 1.4kg) and thinner (15.85mm vs 18mm) but the
-   design of the framework (tapered edges) makes it *feel* thinner
+ * compared to my previous laptop ([[Purism Librem
+   13v4|hardware/purism-librem13v4]]), it feels strangely bulkier and
+   heavier; it's actually *lighter* than the purism (1.3kg vs 1.4kg)
+   and thinner (15.85mm vs 18mm) but the design of the framework
+   (tapered edges) makes it *feel* thinner
 
  * no space for a 2.5" drive
 
@@ -205,8 +210,7 @@ A breeze.
 ## Accessing the board
 
 The internals are access through five TorX screws, but there's a nice
-screwdriver/spudger that works well enough. (In fact, I love that
-thing and I think I'll carry it everywhere.) The keys actually hold in
+screwdriver/spudger that works well enough. The screws actually hold in
 place so you can't even lose them.
 
 The first setup is a bit counter-intuitive coming from the Librem
@@ -214,29 +218,33 @@ laptop, as I expected the back cover to lift and give me access to the
 internals. But instead the screws is release the keyboard and touch
 pad assembly, so you actually need to flip the laptop back upright and
 *lift the assembly off* (!) to get access to the internals. Kind of
-scary. I also actually unplugged a connector in lifting the assembly
-because I lifted it towards the monitor, while you actually need to
-lift it *to the right*. Thankfully, the connector didn't break, it
-just snapped off and I could plug it back in, no harm done.
+scary. 
 
-## First bad QR code
+I also actually unplugged a connector in lifting the assembly because
+I lifted it towards the monitor, while you actually need to lift it
+*to the right*. Thankfully, the connector didn't break, it just
+snapped off and I could plug it back in, no harm done.
 
 Once there, everything is well indicated, with QR codes all over the
 place supposedly leading to online instructions.
 
+## Bad QR codes
+
 Unfortunately, the QR codes I tested (in the expansion card slow, the
 memory slot and CPU slots) did not actually work so I wonder how
-useful those actually are. After all, they need to point to
-*something* and that means a URL, a running website that will answer
-those requests forever. I bet those will break sooner than later and
-in fact, as far as I can tell, they just don't work at all. I prefer
-the approach taken by the MNT reform here which designed (with the
-[100 rabbits folks](https://100r.co/)) an actual paper handbook.
+useful those actually are.
+
+After all, they need to point to *something* and that means a URL, a
+running website that will answer those requests forever. I bet those
+will break sooner than later and in fact, as far as I can tell, they
+just don't work at all. I prefer the approach taken by the MNT reform
+here which designed (with the [100 rabbits folks](https://100r.co/)) an [actual paper
+handbook](https://shop.mntmn.com/products/mnt-reform-operator-handbook) ([PDF](https://mntre.com/media/reform_md/mnt-reform2-operator-handbook.pdf)).
 
 The first qrcode that's immediately visible from the back of the
 laptop, in an expansion cord slot, is a 404. It *seems* to be some
 serial number URL, but I can't actually tell because, well, the page
-is a 404. :)
+is a 404.
 
 I was expecting that bar code to lead me to an introduction page,
 something like "how to setup your Framework laptop". Support actually
@@ -262,31 +270,48 @@ code word is "can you please make a ticket?")
 
 ## Seating disks and memory
 
-The "DIY" kit doesn't have that much to do once you're there. If you
-bought RAM, it's shipped next to the laptop in a little plastic case,
-and you just seat it in as normal. Then you insert your NVMe drive,
-and, if that's your fancy, you also install your own mPCI WiFi
-card. If you ordered one (which was my case), it's pre-installed.
+The "DIY" kit doesn't actually have that much of a setup. If you
+bought RAM, it's shipped outside the laptop in a little plastic case,
+so you just seat it in as usual. 
+
+Then you insert your NVMe drive, and, if that's your fancy, you also
+install your own mPCI WiFi card. If you ordered one (which was my
+case), it's pre-installed.
+
+Closing the laptop is also kind of amazing, because the keyboard
+assembly snaps into place with magnets. I have actually used the
+laptop with the keyboard unscrewed as I was putting the drives in and
+out, and it actually works fine (and will probably void your warranty,
+so don't do that). (But you can.) (But don't, really.)
 
 # Software setup
 
+Once I had everything in the hardware setup, I figured, voilà, I'm
+done, I'm just going to boot this beautiful machine and I can get back
+to work.
+
+I don't understand why I am so naïve some times. It's mind boggling.
+
+Obviously, it didn't happen that way at all, and I spent the best of
+the three following days thinkering with the laptop.
+
 ## Secure boot and EFI
 
-This was less great. I couldn't boot off of the NVMe drive I
-transferred from the previous laptop (the
-[[Purism|hardware/purism-librem13v4]]) and the BIOS was not very
-helpful: it was just failing to find any boot device and complaining
-about it, without dropping me in the real BIOS. At first, I thought it
-was a problem with my NVMe drive, because it's not listed in the
-[compatible SSD drives](https://knowledgebase.frame.work/what-storage-ssd-parts-are-compatible-with-the-framework-laptop-rJOOeHU0_) from upstream.
-
-But I figured out [how to enter BIOS](https://knowledgebase.frame.work/en_us/how-do-i-enter-the-bios-on-the-framework-laptop-HydmWf5Ad) (press <kbd>F2</kbd>
-manically), which showed me the NVMe drive is actually detected, it
-just didn't boot, because it was an old setup without EFI.
-
-From there, I disabled secure boot, and booted a [grml image](https://grml.org/) to try
-to recover. And by "boot" I mean, I managed to get to the grml boot
-loader which promptly failed to load its own root file system
+First, I couldn't boot off of the NVMe drive I transferred from the
+previous laptop (the [[Purism|hardware/purism-librem13v4]]) and the
+BIOS was not very helpful: it was just complaining about not finding
+any boot device, without dropping me in the real BIOS. 
+
+At first, I thought it was a problem with my NVMe drive, because it's
+not listed in the [compatible SSD drives](https://knowledgebase.frame.work/what-storage-ssd-parts-are-compatible-with-the-framework-laptop-rJOOeHU0_) from upstream. But I
+figured out [how to enter BIOS](https://knowledgebase.frame.work/en_us/how-do-i-enter-the-bios-on-the-framework-laptop-HydmWf5Ad) (press <kbd>F2</kbd> manically, of
+course), which showed the NVMe drive iwas actually detected. It just
+didn't boot, because it was an old (2010!!) Debian install without
+EFI.
+
+So from there, I disabled secure boot, and booted a [grml image](https://grml.org/) to
+try to recover. And by "boot" I mean, I managed to get to the grml
+boot loader which promptly failed to load its own root file system
 somehow. I still have to investigate exactly what happened there, but
 it failed some time after the initrd load with:
 
@@ -299,24 +324,29 @@ me to reinstall the bootloader, but that ultimately (and correctly, as
 it turns out) failed because I didn't have a `/boot/efi` partition.
 
 At this point, I realized there was no easy way out of this, and I
-just proceeded to completely reinstall. I had a spare NVMe drive lying
-around (backups FTW!) so I just swapped that in, rebooted in the
-Debian installer again, and did a clean install. I wanted to switch to
-bookworm anyways, so I guess that's done too.
+just proceeded to completely reinstall Debian. I had a spare NVMe
+drive lying around (backups FTW!) so I just swapped that in, rebooted
+in the Debian installer, and did a clean install. I wanted to switch
+to bookworm anyways, so I guess that's done too.
 
 ## Storage limitations
 
 Another thing that happened during setup is that I tried to copy over
-the internal 2.5" SSD drive to the 1TB expansion card I bought from
-Framework, because there's no 2.5" slot in the framework laptop of
-course.
+the internal 2.5" SSD drive from the Purism to the Framework 1TB
+expansion card. There's no 2.5" slot in the new laptop, so that's
+pretty much the only option for storage expansion.
+

(Diff truncated)
move package list to angela archive
diff --git a/hardware/angela.mdwn b/hardware/angela.mdwn
index e064042f..95db3f17 100644
--- a/hardware/angela.mdwn
+++ b/hardware/angela.mdwn
@@ -69,6 +69,23 @@ EVO NVMe drive](https://www.samsung.com/us/computing/memory-storage/solid-state-
 for my workstation (curie). The Samsung drive is now the backup of the
 old angela install.
 
+There were a bunch of packages installed on angela before the
+reinstall that I didn't reinstall. I only restored the packages
+configured in Puppet. According to the [[Puppet optimization
+trick|blog/2022-09-29-optimizing-puppet-bootstrap]] it was around 1700
+packages:
+
+    listing puppet packages...
+    listing apt packages...
+    loading apt cache...
+    1868 unmanaged packages found
+    aapt abiword abiword-common abiword-plugin-grammar acpi-fakekey acpi-support acpi-support-base acpid adwaita-icon-theme aha ahcpd aircrack-ng alex alot alsa-tools alsamixergui androguard android-sdk-platform-tools ant apache2-dev apel apt-src aptitude-common ash astroid at at-spi2-core atftp athena-jot audacious-plugins audacious-plugins-data aumix-common aumix-gtk autoconf autoconf-archive autojump automake autopkgtest autopoint autotools-dev avahi-autoipd avahi-daemon avahi-utils bandit baobab batctl battery-stats bb bc bibtex2html bind9-doc binfmt-support bird-doc bison blackbird-gtk-theme blender blt bluebird-gtk-theme blueman bluetooth bluez-cups bookletimposer borgmatic brasero bridge-utils btrfs-progs buildah bumblebee-status ca-certificates ca-certificates-java cabal-install cabextract cadaver calibre-bin caribou caribou-antler cdpr cgoban cheese chrpath clementine cli-common clustershell clusterssh cmake cmake-data cmatrix cmus comerr-dev command-not-found confclerk conntrack console-data console-setup console-setup-linux cowbuilder cowdancer cpufrequtils cryptsetup cryptsetup-bin cups cups-browsed cups-client cups-common cups-core-drivers cups-daemon cups-filters cups-filters-core-drivers cups-pk-helper cups-ppdc cups-server-common cutecom cvs-fast-export cvsps cython3 darcs darksnow davfs2 db-util db5.3-util dblatex dc dconf-cli dconf-editor dconf-gsettings-backend dcraw dctrl-tools ddate debconf-doc debhelper debian-keyring debian-policy debmake debootstrap debtree decopy default-jre-headless deja-dup desktop-base devhelp devhelp-common devscripts-el dh-autoreconf dh-buildinfo dh-elpa dh-exec dh-make-perl dh-ocaml dh-sysuser di-netboot-assistant dianara dictzip diffoscope diffstat dirmngr distro-info djvulibre-bin dlocate dmeventd dnsdiag dnsutils doc-base doc-rfc docbook docbook-dsssl docbook-to-man docbook-xml docbook-xsl docutils-common docutils-doc doxygen dpkg-dev dpkg-repack drm-info dselect dummydroid duplicity dvipng dvtm dzen2 eatmydata ebtables ed edbrowse efibootmgr elpa-bug-hunter elpa-flycheck-package elpa-git-commit elpa-helm elpa-magit-popup elpa-olivetti elpa-pdf-tools elpa-with-editor empathy empathy-common enblend enfuse eog epiphany epiphany-browser epiphany-data equivs espeak-data eviacam evince evolution evolution-data-server evolution-plugins evtest exiv2 extra-xdg-menus fai-setup-storage fairymax fakeroot faketime fastjar fbless fbreader fbreader-dbgsym fcgiwrap fdupes feed2imap festival feynmf ffmpeg ffmpeg-doc ffmpegthumbnailer fig2dev figlet file-roller fio firebird3.0-common firebird3.0-common-doc firejail flac flake flashrom flent flex flim flvstreamer font-manager fontforge fontforge-common fonts-cantarell fonts-croscore fonts-dkg-handwriting fonts-freefont-ttf fonts-hack fonts-hermit fonts-humor-sans fonts-linuxlibertine fonts-lyx fonts-monoid fonts-noto-cjk fonts-noto-mono fonts-noto-unhinted fonts-sil-gentiumplus fonts-sil-gentiumplus-compact fonts-stix fonts-symbola foomatic-db foomatic-db-engine fortune-mod fortunes-min fpart fracplanet freeglut3 freeipmi-tools freepats freeplane ftp fwupd fzf g++ gamin gcc-arm-linux-gnueabihf gdbserver gdebi gdebi-core gdm3 gedit gedit-plugins genisoimage geographiclib-tools getmail6 gettext gettext-base ghostscript giblib1 gimp-data gir1.2-goocanvas-2.0 gir1.2-gtk-2.0 gir1.2-gtkspell3-3.0 gir1.2-libosinfo-1.0 gir1.2-nm-1.0 gir1.2-nma-1.0 gir1.2-spiceclientgtk-3.0 git-big-picture git-cvs git-doc git-gui git-man gitbatch gitg gitk gitlab-cli gitpkg gitso gkbd-capplet glib-networking global gmpc-data gnokii-cli gnome-backgrounds gnome-bluetooth gnome-books gnome-boxes gnome-calculator gnome-calendar gnome-characters gnome-clocks gnome-color-manager gnome-common gnome-contacts gnome-control-center gnome-dictionary gnome-disk-utility gnome-documents gnome-font-viewer gnome-games gnome-getting-started-docs gnome-keyring gnome-logs gnome-maps gnome-menus gnome-mime-data gnome-music gnome-nettool gnome-online-accounts gnome-online-miners gnome-packagekit gnome-packagekit-data gnome-photos gnome-screenshot gnome-session gnome-settings-daemon gnome-shell gnome-shell-extensions gnome-sound-recorder gnome-sushi gnome-system-log gnome-system-monitor gnome-terminal gnome-themes-extra gnome-todo gnome-tweaks gnome-user-docs gnome-user-share gnome-video-arcade gnome-weather gnucash-common gnucash-docs gnuchess gnuchess-book gnulib gnumeric gnumeric-common gnupg2 gnuplot gnuplot-qt golang-github-containers-common golang-golang-x-tools googletest gopher gperf gphoto2 gpodder gpsbabel-doc gpsd gpsman gpxinfo gr-air-modes gr-hpsdr gr-iio gradle graphicsmagick greybird-gtk-theme grig grml-debootstrap grml2usb groff grub-common grub-imageboot grub-pc-bin grub2-common gsettings-desktop-schemas gsfonts gstreamer1.0-libav gstreamer1.0-nice gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-pulseaudio gthumb gtk-doc-tools gtk2-engines gtkguitune gtklp gvfs-backends gvfs-bin gyp happy haskell-devscripts haveged hddtemp hexchat highlight highlight-common horst hostapd hplip hplip-data htdig html2text htmldoc htmldoc-common httping hugin hugin-data hugin-tools hugo hwdata i3lock i3status ibus ibus-gtk3 ibus-pinyin icecast2 icedtea-netx ices2 icoutils ii imagemagick img2pdf impressive infinoted initscripts input-utils insserv installation-birthday internetarchive intltool intltool-debian iodine iperf iptraf-ng iputils-tracepath ipxe-qemu isc-dhcp-server iucode-tool jackd jackd2 jarwrapper java-common jupyter-notebook keepassx kgb-client kodi kodi-data krb5-multidev lacheck laptop-detect latexmk ldmtool leap-archive-keyring lektor lftp libacl1-dev libaio1 libalgorithm-c3-perl libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl libantlr4-runtime-java libany-moose-perl libao-dev libapp-nopaste-perl libappconfig-perl libapt-pkg-perl libarchive-zip-perl libart-2.0-2 libasm-java libasound2-dev libass-dev libatk-adaptor libatk-bridge2.0-dev libatk1.0-dev libatk1.0-doc libatspi2.0-dev libaudclient2 libaudio-mpd-common-perl libaudio-mpd-perl libaudiofile1 libauthen-dechpwd-perl libauthen-passphrase-perl libautobox-perl libavcodec-dev libavfilter-dev libavformat-dev libb-hooks-endofscope-perl libbison-dev libbit-vector-perl libbluetooth-dev libbluray-dev libboolean-perl libboost-dev libboost-thread-dev libbz2-1.0-dbgsym libc-ares2 libc6-dbg libcache-lru-perl libcairo-script-interpreter2 libcairo2-dev libcamlp4-ocaml-dev libcamomile-ocaml-data libcap-dev libcapture-tiny-perl libcaribou-gtk-module libcaribou-gtk3-module libcarp-assert-more-perl libcarp-assert-perl libcarp-clan-perl libcddb2 libcdio-dev libcec-dev libcgi-formbuilder-perl libcgi-session-perl libcglib-java libchm-bin libchm1 libclass-accessor-chained-perl libclass-accessor-lvalue-perl libclass-accessor-perl libclass-c3-perl libclass-c3-xs-perl libclass-data-inheritable-perl libclass-factory-util-perl libclass-inspector-perl libclass-isa-perl libclass-load-perl libclass-load-xs-perl libclass-method-modifiers-perl libclass-methodmaker-perl libclass-mix-perl libclass-singleton-perl libcln6 libclone-perl libclutter-imcontext-0.1-0 libclutter-imcontext-0.1-bin libcolord-dev libcommons-collections4-java libcommons-net-java libcompress-raw-zlib-perl libconfig-any-perl libconfig-file-perl libconfig-general-perl libconfig-gitlike-perl libconfig-grammar-perl libconfuse-common libconvert-asn1-perl libconvert-binhex-perl libcookie-baker-perl libcpufreq0 libcrossguid-dev libcrypt-des-perl libcrypt-dh-gmp-perl libcrypt-eksblowfish-perl libcrypt-mysql-perl libcrypt-openssl-bignum-perl libcrypt-openssl-rsa-perl libcrypt-passwdmd5-perl libcrypt-rijndael-perl libcrypt-ssleay-perl libcrypt-unixcrypt-xs-perl libcunit1-dev libcurl4-gnutls-dev libcurses-perl libcurses-ui-perl libcwiid-dev libcwiid1 libdata-entropy-perl libdata-float-perl libdata-integer-perl libdata-optlist-perl libdata-page-perl libdata-random-perl libdata-record-perl libdate-calc-perl libdate-calc-xs-perl libdate-manip-perl libdatetime-format-builder-perl libdatetime-format-iso8601-perl libdatetime-format-natural-perl libdatetime-format-strptime-perl libdatetime-locale-perl libdatetime-perl libdatetime-timezone-perl libdbd-mysql-perl libdbd-sqlite3-perl libdbi-perl libdbi1 libdbus-java libdee-1.0-4 libdevel-globaldestruction-perl libdevel-hide-perl libdevel-overloadinfo-perl libdevel-partialdump-perl libdevel-stacktrace-perl libdevmapper-event1.02.1 libdigest-crc-perl libdigest-hmac-perl libdigest-md4-perl libdiscid0 libdist-checkconflicts-perl libdistro-info-perl libdoxia-core-java libdrm-dev libdvdnav-dev libdvdread-dev libeatmydata1 libegl1-mesa-dev libemail-address-perl libemail-date-format-perl libemail-messageid-perl libemail-mime-contenttype-perl libemail-mime-encodings-perl libemail-mime-perl libemail-simple-perl libemail-valid-perl libenca-dev libenca0 libepoxy-dev liberror-perl libev-dev libeval-closure-perl libexception-class-perl libexiv2-dev libexporter-lite-perl libexporter-tiny-perl libextutils-depends-perl libextutils-pkgconfig-perl libfaketime libfcgi-perl libfcgi0ldbl libfdt1 libfelix-osgi-obr-java libfftw3-bin libfftw3-dev libfftw3-long3 libfftw3-quad3 libfftw3-single3 libfile-basedir-perl libfile-chdir-perl libfile-configdir-perl libfile-copy-recursive-perl libfile-find-rule-perl libfile-homedir-perl libfile-libmagic-perl libfile-mmagic-perl libfile-remove-perl libfile-sharedir-perl libfile-touch-perl libfile-which-perl libfinance-quote-perl libfindbugs-java libfindlib-ocaml libfindlib-ocaml-dev libflac-dev libfltk-images1.3 libfltk1.1 libfltk1.3 libfolks-telepathy25 libfont-freetype-perl libfontbox-java libfontembed1 libfreezethaw-perl libfribidi-dev libfs6 libfstrcmp-dev libfstrcmp0 libftgl-dev libfuse-dev libgadu3 libgamin0 libgcrypt20-dev libgd-perl libgdiplus libgdk-pixbuf2.0-dev libgdome2-0 libgee-0.8-dev libgetopt-argvfile-perl libgetopt-euclid-perl libgetopt-long-descriptive-perl libgettextpo0 libghc-pandoc-dev libgif-dev libgimp2.0 libgit-wrapper-perl libgit2-dev libgl1-mesa-dev libgl1-mesa-glx libgl1:i386 libglade2-0 libglade2-dev libgladeui-common libglew-dev libglib2.0-bin libglib2.0-cil libglib2.0-dev libglib2.0-doc libglu1-mesa libglu1-mesa-dev libgnomecanvas2-common libgnupg-interface-perl libgnutls-openssl27 libgnutls28-dev libgoocanvas-2.0-9 libgoocanvas-2.0-common libgovirt-common libgovirt2 libgpars-groovy-java libgpg-error-dev libgraphicsmagick-q16-3 libgraphite2-dev libgravatar-url-perl libgringotts2 libgsf-bin libgssrpc4 libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev libgtk-3-dev libgtk-3-doc libgtk2.0-cil libgtk2.0-dev libgtkspell0 libgts-0.7-5 libgts-bin libguestfs-tools libguice-java libhamlib-doc libhamlib-utils libharfbuzz-dev libharfbuzz-gobject0 libhighlight-perl libhpmud0 libhsqldb1.8.0-java libhtml-lint-perl libhtml-scrubber-perl libhtml-tableextract-perl libhtml-template-perl libhttp-headers-fast-perl libhttp-lite-perl libhttp-parser-dev libhttp-server-simple-perl libhugs-network-bundled libibus-1.0-dev libibverbs1 libidn11-dev libimage-exiftool-perl libimage-magick-perl libimage-magick-q16-perl libimobiledevice-utils libimport-into-perl libintl-perl libio-pty-perl libio-string-perl libio-stringy-perl libipc-run-perl libipc-run3-perl libipc-shareable-perl libipc-signal-perl libipc-system-simple-perl libiso9660-dev libiw30 libjaxp1.3-java libjcsp-java libjctools-java libjetty9-extra-java libjetty9-java libjformatstring-java libjline2-java libjna-platform-java libjnr-constants-java libjnr-ffi-java libjpeg-dev libjq1 libjs-angularjs libjs-inherits libjs-jquery-throttle-debounce libjs-lodash libjs-openlayers libjs-prototype libjs-scriptaculous libjson-any-perl libjson-glib-dev libjson-perl libjsr166y-java libkeybinder-3.0-0 libkrb5-dev libkxml2-java liblcms2-dev liblcms2-utils libldap2-dev libldm-1.0-0 liblensfun-data-v1 liblensfun-dev liblensfun1 liblinear-tools liblist-allutils-perl liblist-compare-perl liblist-moreutils-perl liblist-someutils-perl liblist-utilsby-perl liblog-dispatch-perl liblog-log4perl-perl libloudmouth1-0 liblouisutdml-bin liblouisutdml-data liblqr-1-0 libltdl-dev liblua5.1-0 liblua5.2-dev libluajit-5.1-dev liblwpx-paranoidagent-perl liblz4-dev liblzo2-dev libm17n-0 libmad0 libmad0-dev libmail-box-perl libmail-sendmail-perl libmarkdown2 libmath-bigint-perl libmath-round-perl libmaven3-core-java libmbedtls-dev libmcrypt4 libmd0 libmeanwhile1 libmicrohttpd-dev libmime-base64-urlsafe-perl libmime-charset-perl libmime-tools-perl libmime-types-perl libmission-control-plugins0 libmng1 libmodplug-dev libmodule-implementation-perl libmodule-pluggable-perl libmodule-runtime-conflicts-perl libmodule-runtime-perl libmono-addins-gui0.2-cil libmono-addins0.2-cil libmono-cairo4.0-cil libmono-data-tds4.0-cil libmono-i18n-west4.0-cil libmono-i18n4.0-cil libmono-posix4.0-cil libmono-security4.0-cil libmono-sharpzip4.84-cil libmono-simd4.0-cil libmono-sqlite4.0-cil libmono-system-configuration4.0-cil libmono-system-core4.0-cil libmono-system-data4.0-cil libmono-system-drawing4.0-cil libmono-system-enterpriseservices4.0-cil libmono-system-numerics4.0-cil libmono-system-security4.0-cil libmono-system-transactions4.0-cil libmono-system-web-applicationservices4.0-cil libmono-system-web-services4.0-cil libmono-system-web4.0-cil libmono-system-xml4.0-cil libmono-system4.0-cil libmoo-perl libmoose-autobox-perl libmoose-perl libmoosex-has-sugar-perl libmoosex-semiaffordanceaccessor-perl libmoosex-types-perl libmoox-configfromfile-perl libmoox-file-configdir-perl libmoox-late-perl libmoox-options-perl libmouse-perl libmousex-getopt-perl libmousex-types-path-class-perl libmousex-types-perl libmp3-info-perl libmp3-tag-perl libmp3lame-dev libmpd1 libmpdclient2 libmpeg2-4-dev libmro-compat-perl libmultiverse-core-java libnamespace-autoclean-perl libnamespace-clean-perl libncurses5 libnet-bonjour-perl libnet-daemon-perl libnet-dbus-glib-perl libnet-dns-perl libnet-domain-tld-perl libnet-dropbox-api-perl libnet-github-perl libnet-inet6glue-perl libnet-ip-perl libnet-ldap-perl libnet-oauth-perl libnet-openid-common-perl libnet-openid-consumer-perl libnet-rendezvous-publish-backend-avahi-perl libnet-rendezvous-publish-perl libnet-telnet-perl libnetpbm10 libnfs-dev libnginx-mod-http-auth-pam libnginx-mod-http-dav-ext libnginx-mod-http-echo libnginx-mod-http-geoip libnginx-mod-http-image-filter libnginx-mod-http-subs-filter libnginx-mod-http-upstream-fair libnginx-mod-http-xslt-filter libnginx-mod-mail libnginx-mod-stream libnih-dbus1 libnih1 libnl-3-dev libnl-genl-3-dev libnl-route-3-dev libnm0 libnotify-dev libnotmuch-dev libnova-0.16-0 libnumber-compare-perl libobject-realize-later-perl libodbc1 libogg-dev libogg-vorbis-header-pureperl-perl libopenexr-dev libopus-dev libosgi-annotation-java libosip2-dev libosp5 libossp-uuid-perl libossp-uuid16 libotf0 libotr5 libotr5-bin libotr5-dev libots0 libout123-0 libp11-kit-dev libp8-platform-dev libpackage-deprecationmanager-perl libpackage-stash-perl libpackage-stash-xs-perl libpam-gnome-keyring libpam0g-dev libpango-perl libpango1.0-dev libpango1.0-doc libpano13-bin libparams-classify-perl libparams-util-perl libparams-validate-perl libparams-validationcompiler-perl libparse-debcontrol-perl libpasswdqc0 libpath-class-perl libpath-tiny-perl libpathplan4 libpcap0.8-dev libpci-dev libpcre16-3 libpcre3-dev libpcre32-3 libperl6-junction-perl libpixman-1-dev libplexus-component-annotations-java libplexus-component-metadata-java libplexus-container-default1.5-java libplist-dev libplot2c2 libportaudio2 libportmidi0 libpostproc-dev libproc-daemon-perl libproc-invokeeditor-perl libproc-processtable-perl libproc-simple-perl libproc-waitstat-perl libpstoedit0c2a libptexenc1 libpurple-bin libpurple0 libpython2.7-dev libqalculate-doc libqdox2-java librcc0 librcd0 libreadonly-perl librecode0 libregexp-assemble-perl libregexp-common-perl libreoffice-calc libreoffice-gnome libreoffice-impress libreoffice-java-common libreoffice-writer libresid-builder0c2a librole-tiny-perl librpc-xml-perl librrd8 librrds-perl librsvg2-bin librsvg2-dev librtmp-dev libsamplerate0-dev libsane-hpaio libscalar-string-perl libscope-guard-perl libsdl-image1.2 libsdl-mixer1.2 libsdl-ttf2.0-0 libsdl1.2-dev libsdl2-dev libsdl2-image-2.0-0 libsdl2-image-dev libsdl2-mixer-2.0-0 libsdl2-mixer-dev libserf-1-1 libset-scalar-perl libshairport-dev libsidplay2 libsidplay2-dev libsidutils0 libsimple-http-java libsisu-inject-java libsisu-plexus-java libsmbclient-dev libsmi2ldbl libsndio-dev libsoap-lite-perl libsodium-dev libsofia-sip-ua-glib3 libsofia-sip-ua0 libsort-naturally-perl libsort-versions-perl libsoup2.4-dev libsource-highlight-common libsox-fmt-alsa libsox-fmt-base libspandsp-dev libspecio-perl libspeex-dev libspeexdsp-dev libspice-server1 libspring-beans-java libspring-core-java libsqlite3-dev libssh2-1-dev libssl-doc libstrictures-perl libstring-bufferstack-perl libstring-formatter-perl libstring-shellquote-perl libstrongswan-standard-plugins libsub-exporter-formethods-perl libsub-exporter-perl libsub-exporter-progressive-perl libsub-identify-perl libsub-install-perl libsub-name-perl libsub-uplevel-perl libsvm-tools libsvn-dev libsvn-perl libsvn1 libswitch-perl libswresample-dev libswscale-dev libsys-hostname-long-perl libsysfs2 libtag1-dev libtaglibs-standard-impl-java libtaglibs-standard-spec-java libtalloc-dev libtask-weaken-perl libtbb2 libtelepathy-farstream3 libtelepathy-glib0 libtelepathy-logger3 libtemplate-declare-perl libtemplate-perl libterm-readline-gnu-perl libterm-readline-perl-perl libterm-shell-perl libterm-size-any-perl libterm-size-perl libterm-size-perl-perl libtest-exception-perl libtest-fatal-perl libtest-http-server-simple-perl libtest-longstring-perl libtest-script-run-perl libtest-www-mechanize-perl libtexluajit2 libtext-autoformat-perl libtext-csv-perl libtext-csv-xs-perl libtext-glob-perl libtext-markdown-discount-perl libtext-markdown-perl libtext-reform-perl libtext-template-perl libtext-wikicreole-perl libtheora-dev libtie-cache-perl libtiff5-dev libtime-duration-parse-perl libtime-duration-perl libtime-progress-perl libtinfo5 libtinyxml-dev libtokyocabinet9 libtool libtype-tiny-perl libtypes-path-tiny-perl libunicode-linebreak-perl libunicode-string-perl libuniconf4.6 libupnp-dev libusb-0.1-4 libuser-identity-perl libuuid-perl libuuid-tiny-perl libuv1 libuv1-dev libv4l-dev libva-dev libvariable-magic-perl libvcdinfo0 libvde0 libvdeplug2 libvdpau-dev libvirt-clients libvirt-doc libvirtodbc0 libvisual-0.4-plugins libvlc-bin libvlc5 libvorbis-dev libvpx-dev libvte-common libvte-dev libvte9 libvulkan1 libvulkan1:i386 libwant-perl libwayland-bin libwayland-dev libwildmidi-config libwireshark-data libwmf-bin libwmf0.2-7 libwv-1.2-4 libwvstreams4.6-base libwvstreams4.6-extras libwww-mechanize-gzip-perl libwww-mechanize-perl libx11-doc libx11-protocol-other-perl libx11-xcb-dev libx86-1 libxalan2-java libxapian-dev libxcb-dri2-0-dev libxcb-dri3-dev libxcb-glx0-dev libxcb-present-dev libxcb-randr0-dev libxcb-render0-dev libxcb-shape0-dev libxcb-shm0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdelta2 libxenstore3.0 libxerces2-java libxfixes-dev libxi-dev libxine2 libxine2-bin libxine2-ffmpeg libxine2-misc-plugins libxine2-plugins libxine2-x libxkbcommon-dev libxkbfile-dev libxml-atom-simplefeed-perl libxml-commons-external-java libxml-commons-resolver1.1-java libxml-feedpp-perl libxml-namespacesupport-perl libxml-sax-base-perl libxml-sax-expat-perl libxml-sax-perl libxml-simple-perl libxml-treepp-perl libxml-writer-perl libxml2-utils libxmlsec1-dev libxmu-dev libxmu-headers libxshmfence-dev libxtst-dev libxv-dev libxxf86vm-dev libyajl-dev libyaml-libyaml-perl libyaml-perl libyaml-syck-perl libyaml-tiny-perl libzephyr4 libzip4 libzlcore-data libzltext-data link-grammar-dictionaries-en linphone-common linssid lintian linux-image-5.18.0-0.bpo.1-amd64 linux-image-amd64 liquidsoap live-build lm-sensors lmodern lnav lockfile-progs luminance-hdr lvm2 lxrandr lynx lzma m17n-db m4 macchanger maelstrom magic-wormhole maildrop mailscripts make makedev makepasswd mame man2html mandoc marble mate-desktop-environment mbr mc mc-data meld memtest86 mercurial-common mesa-common-dev mesa-utils metar mime-construct minicom miscfiles mkdocs mktorrent moc moc-ffmpeg-plugin module-assistant mono-4.0-gac mono-gac mono-runtime mousepad mp3info mpg123 mpv mscompress msr-tools mswatch mtools mupdf musescore3 nautilus nautilus-extension-brasero nautilus-sendto ncftp nd ndisc6 nec2c neomutt net-tools nethack-common nethack-console netpbm network-manager-dev network-manager-openvpn network-manager-vpnc network-manager-vpnc-gnome nginx nginx-common nginx-doc nginx-full nmon node-amdefine node-balanced-match node-brace-expansion node-builtin-modules node-concat-map node-fs.realpath node-hosted-git-info node-inflight node-is-builtin-module node-isexe node-path-is-absolute node-pseudomap node-source-map node-spdx-correct node-spdx-expression-parse node-spdx-license-ids node-validate-npm-package-license node-wrappy node-yallist notmuch-mutt ntpdate nvme-cli nwipe obs-studio ocaml-base-nox ocaml-findlib ocaml-interp ocrfeeder odbcinst odbcinst1debian2 offlineimap3 okular okular-extra-backends openbsd-inetd opensc-pkcs11 openstack-pkg-tools os-prober osmo oss-compat owx oxygen-icon-theme oz paprefs patch patchutils pbuilder pbzip2 pcmanfm pcmciautils pdf-presenter-console pelican pepper perl-tk perlmagick pflogsumm php-cli php-common php-console-table php-pear php-xml physlock pi picocom pidgin-data pidgin-guifications pidgin-otr pius plymouth-themes pm-utils po-debconf poc-streamer poppler-utils postgresql-client-common powermgmt-base pppoe pppoeconf pqiv preview-latex-style printer-driver-all printer-driver-c2050 printer-driver-c2esp printer-driver-cjet printer-driver-escpr printer-driver-foo2zjs printer-driver-foo2zjs-common printer-driver-fujixerox printer-driver-gutenprint printer-driver-hpcups printer-driver-hpijs printer-driver-m2300w printer-driver-min12xxw printer-driver-pnm2ppa printer-driver-postscript-hp printer-driver-ptouch printer-driver-pxljr printer-driver-sag-gdi printer-driver-splix pristine-tar progress prometheus-node-exporter protobuf-compiler ps2eps pssh pstoedit psutils pulseaudio pulseaudio-module-bluetooth pumpa purifyeps pxlib1 pycodestyle pyflakes3 pypy python-dbus-dev python-flask-doc python-gi-dev python-jinja2 python-jinja2-doc python-markupsafe python-matplotlib-data python-nose2-doc python-tk python2.7-doc python3-acoustid python3-all python3-attr python3-blinker python3-bs4 python3-build python3-cachecontrol python3-cffi python3-cffi-backend python3-characteristic python3-click python3-clustershell python3-colorlog python3-colour python3-constantly python3-cryptography python3-cycler python3-dateparser python3-dev python3-distutils-extra python3-docopt python3-docutils python3-elasticsearch python3-examples python3-feedparser python3-flake8 python3-future python3-geoip python3-git python3-gitdb python3-gitlab python3-gphoto2 python3-hkdf python3-humanfriendly python3-humanize python3-i3ipc python3-importlib-metadata python3-incremental python3-ipython python3-ipython-genutils python3-jinja2 python3-keyring python3-keyrings.alt python3-ldap python3-livereload python3-lockfile python3-lxml python3-markdown python3-matplotlib python3-musicpd python3-newt python3-notebook python3-notify2 python3-openssl python3-pandas python3-pbr python3-pexpect python3-pickleshare python3-pil python3-pilkit python3-ply python3-prompt-toolkit python3-ptyprocess python3-pyasn1-modules python3-pycodestyle python3-pycparser python3-pyflakes python3-pystache python3-pytest-cov python3-pytest-runner python3-pyudev python3-requests-file python3-secretstorage python3-serial python3-service-identity python3-sh python3-smmap python3-socks python3-spake2 python3-tabulate python3-termcolor python3-tqdm python3-traitlets python3-twisted python3-usb python3-venv python3-wcwidth python3-whois python3-xdo python3-zope.interface qemu-system qemu-user qemu-utils qgo qprint qqwing qrencode qtbase5-dev qthid-fcd-controller qttools5-dev-tools quvi r-cran-ggplot2 r-cran-reshape2 radeontool radvd rake rdesktop recode resolvconf restic rhythmbox rhythmbox-plugin-cdrecorder rhythmbox-plugins ristretto roffit rst2pdf rtmpdump ruby ruby-bundler ruby-cairo ruby-deep-merge ruby-dev ruby-did-you-mean ruby-faraday ruby-gettext ruby-html-proofer ruby-kramdown-rfc2629 ruby-locale ruby-minitest ruby-net-telnet ruby-nokogiri ruby-open4 ruby-pkg-config ruby-power-assert ruby-ronn ruby-rspec-puppet ruby-test-unit ruby-text-format rygel-playbin rygel-preferences rygel-tracker sacc samba-common samba-common-bin saytime sc scons scrcpy screenfetch scrot sdate seabios seahorse seahorse-daemon sendxmpp sent sgml-data sharutils shelldap shotwell signify signify-openbsd signify-openbsd-keys signing-party simple-scan simplescreenrecorder slib smartmontools smbclient sockstat sound-juicer sound-theme-freedesktop source-highlight spawn-fcgi sphinx-common sphinx-doc sqlite3 sqlite3-doc squid-deb-proxy-client ssh-askpass ssh-audit sshuttle ssl-cert startpar steam:i386 stellarium-data stress stress-ng strip-nondeterminism strongswan suckless-tools sudoku svn-buildpackage sweethome3d swig swish++ symlinks synaptic syncthing sysfsutils syslinux syslinux-common system-config-printer-common system-config-printer-udev sysuser-helper sysv-rc sysv-rc-conf tango-icon-theme tasksel taskwarrior tcl tcpd telepathy-haze telepathy-idle telepathy-logger telepathy-mission-control-5 telepathy-rakia telepathy-salut tellico tellico-data tellico-scripts telnet tesseract-ocr tex-common texlive texlive-base texlive-bibtex-extra texlive-binaries texlive-extra-utils texlive-font-utils texlive-fonts-extra texlive-fonts-recommended texlive-fonts-recommended-doc texlive-lang-french texlive-latex-base-doc texlive-latex-extra-doc texlive-latex-recommended-doc texlive-metapost texlive-metapost-doc texlive-pictures texlive-pictures-doc texlive-pstricks texlive-pstricks-doc texlive-xetex tftp-hpa tftpd thunar-archive-plugin thunar-data thunar-media-tags-plugin thunar-volman tidy tig tipa tk tla tla-doc tmate toilet-fonts tor-geoipdb torsocks totem totem-plugins traceroute tracker transgui translate-shell transmission transmission-cli transmission-gtk transmission-qt-dbgsym trustedqsl tsocks uhd-host uhubctl unicode-data units unixodbc unp unrar-free uuid v4l-utils va-driver-all vacation vagrant-cachier vagrant-libvirt vagrant-sshfs valac vbetool vbindiff vde2 vgabios viking vim-runtime vinagre vino virt-manager virtualenvwrapper virtuoso-minimal visidata vlan vlc-bin vlc-data vlc-l10n vlc-plugin-base vlc-plugin-notify vlc-plugin-video-output vlc-plugin-video-splitter vlc-plugin-visualization vlock vnstat vorbis-tools vorbisgain vpnc vulkan-tools:i386 w3c-linkchecker w3m wamerican wayland-protocols wdiff weechat weechat-doc weechat-scripts wfrench whipper whohas wipe wireshark wireshark-common workrave-data wvdial wwwconfig-common x11-apps x11-session-utils x11-xfs-utils x11proto-record-dev x11proto-xf86vidmode-dev x11vnc xaos xapian-doc xapian-examples xapian-omega xapian-tools xautolock xbase-clients xbindkeys xboard xclip xdelta xdelta3 xdg-user-dirs-gtk xfburn xfce4 xfce4-appfinder xfce4-battery-plugin xfce4-clipman xfce4-clipman-plugin xfce4-cpufreq-plugin xfce4-cpugraph-plugin xfce4-datetime-plugin xfce4-dict xfce4-diskperf-plugin xfce4-fsguard-plugin xfce4-genmon-plugin xfce4-goodies xfce4-mailwatch-plugin xfce4-mount-plugin xfce4-netload-plugin xfce4-panel xfce4-places-plugin xfce4-pulseaudio-plugin xfce4-screenshooter xfce4-sensors-plugin xfce4-smartbookmark-plugin xfce4-systemload-plugin xfce4-taskmanager xfce4-timer-plugin xfce4-verve-plugin xfce4-wavelan-plugin xfce4-weather-plugin xfce4-xkb-plugin xfonts-100dpi xfonts-75dpi xfonts-scalable xgnokii xine-ui xininfo xinit xli xloadimage xml-core xml2rfc xmlto xmms2-plugin-daap xnec2c xorg xorg-docs xorg-docs-core xpdf xplanet-images xpra xsane-common xscreensaver-data xscreensaver-data-extra xsltproc xtrace xtrlock xvfb xxd yasm yelp yubioath-desktop zathura zeitgeist-core zenity zip zonemaster-cli zsh
+    popcon stats not available: [Errno 2] No such file or directory: '/var/log/popularity-contest'
+
+OMFG. 1868 packages. Life is too short to get through all of
+this. YOLO, and I guess I'll live with the repeated "aargh why isn't
+this installed" problem and just deal with this as I go along.
+
 See [[hardware/laptop/framework-12th-gen]] for a detailed review.
 
 [[!tag node]]
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 0a5d7e63..8b8e3669 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -352,30 +352,15 @@ directories:
     /var/lib/puppet
 
 So that I would keep the previous machine's identity. That way I could
-contact the Puppet server and install whatever was missing. I used the
+contact the Puppet server and install whatever was missing. I used my
 [[Puppet optimization
 trick|blog/2022-09-29-optimizing-puppet-bootstrap]] to do a batch
-install and then I had a good base setup.
-
-Of course, that only gave me packages that were in Puppet. The actual
-install on the original angela workstation had a *lot* more stuff
-installed. Around 1700 packages, actually:
-
-    listing puppet packages...
-    listing apt packages...
-    loading apt cache...
-    1868 unmanaged packages found
-    aapt abiword abiword-common abiword-plugin-grammar acpi-fakekey acpi-support acpi-support-base acpid adwaita-icon-theme aha ahcpd aircrack-ng alex alot alsa-tools alsamixergui androguard android-sdk-platform-tools ant apache2-dev apel apt-src aptitude-common ash astroid at at-spi2-core atftp athena-jot audacious-plugins audacious-plugins-data aumix-common aumix-gtk autoconf autoconf-archive autojump automake autopkgtest autopoint autotools-dev avahi-autoipd avahi-daemon avahi-utils bandit baobab batctl battery-stats bb bc bibtex2html bind9-doc binfmt-support bird-doc bison blackbird-gtk-theme blender blt bluebird-gtk-theme blueman bluetooth bluez-cups bookletimposer borgmatic brasero bridge-utils btrfs-progs buildah bumblebee-status ca-certificates ca-certificates-java cabal-install cabextract cadaver calibre-bin caribou caribou-antler cdpr cgoban cheese chrpath clementine cli-common clustershell clusterssh cmake cmake-data cmatrix cmus comerr-dev command-not-found confclerk conntrack console-data console-setup console-setup-linux cowbuilder cowdancer cpufrequtils cryptsetup cryptsetup-bin cups cups-browsed cups-client cups-common cups-core-drivers cups-daemon cups-filters cups-filters-core-drivers cups-pk-helper cups-ppdc cups-server-common cutecom cvs-fast-export cvsps cython3 darcs darksnow davfs2 db-util db5.3-util dblatex dc dconf-cli dconf-editor dconf-gsettings-backend dcraw dctrl-tools ddate debconf-doc debhelper debian-keyring debian-policy debmake debootstrap debtree decopy default-jre-headless deja-dup desktop-base devhelp devhelp-common devscripts-el dh-autoreconf dh-buildinfo dh-elpa dh-exec dh-make-perl dh-ocaml dh-sysuser di-netboot-assistant dianara dictzip diffoscope diffstat dirmngr distro-info djvulibre-bin dlocate dmeventd dnsdiag dnsutils doc-base doc-rfc docbook docbook-dsssl docbook-to-man docbook-xml docbook-xsl docutils-common docutils-doc doxygen dpkg-dev dpkg-repack drm-info dselect dummydroid duplicity dvipng dvtm dzen2 eatmydata ebtables ed edbrowse efibootmgr elpa-bug-hunter elpa-flycheck-package elpa-git-commit elpa-helm elpa-magit-popup elpa-olivetti elpa-pdf-tools elpa-with-editor empathy empathy-common enblend enfuse eog epiphany epiphany-browser epiphany-data equivs espeak-data eviacam evince evolution evolution-data-server evolution-plugins evtest exiv2 extra-xdg-menus fai-setup-storage fairymax fakeroot faketime fastjar fbless fbreader fbreader-dbgsym fcgiwrap fdupes feed2imap festival feynmf ffmpeg ffmpeg-doc ffmpegthumbnailer fig2dev figlet file-roller fio firebird3.0-common firebird3.0-common-doc firejail flac flake flashrom flent flex flim flvstreamer font-manager fontforge fontforge-common fonts-cantarell fonts-croscore fonts-dkg-handwriting fonts-freefont-ttf fonts-hack fonts-hermit fonts-humor-sans fonts-linuxlibertine fonts-lyx fonts-monoid fonts-noto-cjk fonts-noto-mono fonts-noto-unhinted fonts-sil-gentiumplus fonts-sil-gentiumplus-compact fonts-stix fonts-symbola foomatic-db foomatic-db-engine fortune-mod fortunes-min fpart fracplanet freeglut3 freeipmi-tools freepats freeplane ftp fwupd fzf g++ gamin gcc-arm-linux-gnueabihf gdbserver gdebi gdebi-core gdm3 gedit gedit-plugins genisoimage geographiclib-tools getmail6 gettext gettext-base ghostscript giblib1 gimp-data gir1.2-goocanvas-2.0 gir1.2-gtk-2.0 gir1.2-gtkspell3-3.0 gir1.2-libosinfo-1.0 gir1.2-nm-1.0 gir1.2-nma-1.0 gir1.2-spiceclientgtk-3.0 git-big-picture git-cvs git-doc git-gui git-man gitbatch gitg gitk gitlab-cli gitpkg gitso gkbd-capplet glib-networking global gmpc-data gnokii-cli gnome-backgrounds gnome-bluetooth gnome-books gnome-boxes gnome-calculator gnome-calendar gnome-characters gnome-clocks gnome-color-manager gnome-common gnome-contacts gnome-control-center gnome-dictionary gnome-disk-utility gnome-documents gnome-font-viewer gnome-games gnome-getting-started-docs gnome-keyring gnome-logs gnome-maps gnome-menus gnome-mime-data gnome-music gnome-nettool gnome-online-accounts gnome-online-miners gnome-packagekit gnome-packagekit-data gnome-photos gnome-screenshot gnome-session gnome-settings-daemon gnome-shell gnome-shell-extensions gnome-sound-recorder gnome-sushi gnome-system-log gnome-system-monitor gnome-terminal gnome-themes-extra gnome-todo gnome-tweaks gnome-user-docs gnome-user-share gnome-video-arcade gnome-weather gnucash-common gnucash-docs gnuchess gnuchess-book gnulib gnumeric gnumeric-common gnupg2 gnuplot gnuplot-qt golang-github-containers-common golang-golang-x-tools googletest gopher gperf gphoto2 gpodder gpsbabel-doc gpsd gpsman gpxinfo gr-air-modes gr-hpsdr gr-iio gradle graphicsmagick greybird-gtk-theme grig grml-debootstrap grml2usb groff grub-common grub-imageboot grub-pc-bin grub2-common gsettings-desktop-schemas gsfonts gstreamer1.0-libav gstreamer1.0-nice gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-pulseaudio gthumb gtk-doc-tools gtk2-engines gtkguitune gtklp gvfs-backends gvfs-bin gyp happy haskell-devscripts haveged hddtemp hexchat highlight highlight-common horst hostapd hplip hplip-data htdig html2text htmldoc htmldoc-common httping hugin hugin-data hugin-tools hugo hwdata i3lock i3status ibus ibus-gtk3 ibus-pinyin icecast2 icedtea-netx ices2 icoutils ii imagemagick img2pdf impressive infinoted initscripts input-utils insserv installation-birthday internetarchive intltool intltool-debian iodine iperf iptraf-ng iputils-tracepath ipxe-qemu isc-dhcp-server iucode-tool jackd jackd2 jarwrapper java-common jupyter-notebook keepassx kgb-client kodi kodi-data krb5-multidev lacheck laptop-detect latexmk ldmtool leap-archive-keyring lektor lftp libacl1-dev libaio1 libalgorithm-c3-perl libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl libantlr4-runtime-java libany-moose-perl libao-dev libapp-nopaste-perl libappconfig-perl libapt-pkg-perl libarchive-zip-perl libart-2.0-2 libasm-java libasound2-dev libass-dev libatk-adaptor libatk-bridge2.0-dev libatk1.0-dev libatk1.0-doc libatspi2.0-dev libaudclient2 libaudio-mpd-common-perl libaudio-mpd-perl libaudiofile1 libauthen-dechpwd-perl libauthen-passphrase-perl libautobox-perl libavcodec-dev libavfilter-dev libavformat-dev libb-hooks-endofscope-perl libbison-dev libbit-vector-perl libbluetooth-dev libbluray-dev libboolean-perl libboost-dev libboost-thread-dev libbz2-1.0-dbgsym libc-ares2 libc6-dbg libcache-lru-perl libcairo-script-interpreter2 libcairo2-dev libcamlp4-ocaml-dev libcamomile-ocaml-data libcap-dev libcapture-tiny-perl libcaribou-gtk-module libcaribou-gtk3-module libcarp-assert-more-perl libcarp-assert-perl libcarp-clan-perl libcddb2 libcdio-dev libcec-dev libcgi-formbuilder-perl libcgi-session-perl libcglib-java libchm-bin libchm1 libclass-accessor-chained-perl libclass-accessor-lvalue-perl libclass-accessor-perl libclass-c3-perl libclass-c3-xs-perl libclass-data-inheritable-perl libclass-factory-util-perl libclass-inspector-perl libclass-isa-perl libclass-load-perl libclass-load-xs-perl libclass-method-modifiers-perl libclass-methodmaker-perl libclass-mix-perl libclass-singleton-perl libcln6 libclone-perl libclutter-imcontext-0.1-0 libclutter-imcontext-0.1-bin libcolord-dev libcommons-collections4-java libcommons-net-java libcompress-raw-zlib-perl libconfig-any-perl libconfig-file-perl libconfig-general-perl libconfig-gitlike-perl libconfig-grammar-perl libconfuse-common libconvert-asn1-perl libconvert-binhex-perl libcookie-baker-perl libcpufreq0 libcrossguid-dev libcrypt-des-perl libcrypt-dh-gmp-perl libcrypt-eksblowfish-perl libcrypt-mysql-perl libcrypt-openssl-bignum-perl libcrypt-openssl-rsa-perl libcrypt-passwdmd5-perl libcrypt-rijndael-perl libcrypt-ssleay-perl libcrypt-unixcrypt-xs-perl libcunit1-dev libcurl4-gnutls-dev libcurses-perl libcurses-ui-perl libcwiid-dev libcwiid1 libdata-entropy-perl libdata-float-perl libdata-integer-perl libdata-optlist-perl libdata-page-perl libdata-random-perl libdata-record-perl libdate-calc-perl libdate-calc-xs-perl libdate-manip-perl libdatetime-format-builder-perl libdatetime-format-iso8601-perl libdatetime-format-natural-perl libdatetime-format-strptime-perl libdatetime-locale-perl libdatetime-perl libdatetime-timezone-perl libdbd-mysql-perl libdbd-sqlite3-perl libdbi-perl libdbi1 libdbus-java libdee-1.0-4 libdevel-globaldestruction-perl libdevel-hide-perl libdevel-overloadinfo-perl libdevel-partialdump-perl libdevel-stacktrace-perl libdevmapper-event1.02.1 libdigest-crc-perl libdigest-hmac-perl libdigest-md4-perl libdiscid0 libdist-checkconflicts-perl libdistro-info-perl libdoxia-core-java libdrm-dev libdvdnav-dev libdvdread-dev libeatmydata1 libegl1-mesa-dev libemail-address-perl libemail-date-format-perl libemail-messageid-perl libemail-mime-contenttype-perl libemail-mime-encodings-perl libemail-mime-perl libemail-simple-perl libemail-valid-perl libenca-dev libenca0 libepoxy-dev liberror-perl libev-dev libeval-closure-perl libexception-class-perl libexiv2-dev libexporter-lite-perl libexporter-tiny-perl libextutils-depends-perl libextutils-pkgconfig-perl libfaketime libfcgi-perl libfcgi0ldbl libfdt1 libfelix-osgi-obr-java libfftw3-bin libfftw3-dev libfftw3-long3 libfftw3-quad3 libfftw3-single3 libfile-basedir-perl libfile-chdir-perl libfile-configdir-perl libfile-copy-recursive-perl libfile-find-rule-perl libfile-homedir-perl libfile-libmagic-perl libfile-mmagic-perl libfile-remove-perl libfile-sharedir-perl libfile-touch-perl libfile-which-perl libfinance-quote-perl libfindbugs-java libfindlib-ocaml libfindlib-ocaml-dev libflac-dev libfltk-images1.3 libfltk1.1 libfltk1.3 libfolks-telepathy25 libfont-freetype-perl libfontbox-java libfontembed1 libfreezethaw-perl libfribidi-dev libfs6 libfstrcmp-dev libfstrcmp0 libftgl-dev libfuse-dev libgadu3 libgamin0 libgcrypt20-dev libgd-perl libgdiplus libgdk-pixbuf2.0-dev libgdome2-0 libgee-0.8-dev libgetopt-argvfile-perl libgetopt-euclid-perl libgetopt-long-descriptive-perl libgettextpo0 libghc-pandoc-dev libgif-dev libgimp2.0 libgit-wrapper-perl libgit2-dev libgl1-mesa-dev libgl1-mesa-glx libgl1:i386 libglade2-0 libglade2-dev libgladeui-common libglew-dev libglib2.0-bin libglib2.0-cil libglib2.0-dev libglib2.0-doc libglu1-mesa libglu1-mesa-dev libgnomecanvas2-common libgnupg-interface-perl libgnutls-openssl27 libgnutls28-dev libgoocanvas-2.0-9 libgoocanvas-2.0-common libgovirt-common libgovirt2 libgpars-groovy-java libgpg-error-dev libgraphicsmagick-q16-3 libgraphite2-dev libgravatar-url-perl libgringotts2 libgsf-bin libgssrpc4 libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev libgtk-3-dev libgtk-3-doc libgtk2.0-cil libgtk2.0-dev libgtkspell0 libgts-0.7-5 libgts-bin libguestfs-tools libguice-java libhamlib-doc libhamlib-utils libharfbuzz-dev libharfbuzz-gobject0 libhighlight-perl libhpmud0 libhsqldb1.8.0-java libhtml-lint-perl libhtml-scrubber-perl libhtml-tableextract-perl libhtml-template-perl libhttp-headers-fast-perl libhttp-lite-perl libhttp-parser-dev libhttp-server-simple-perl libhugs-network-bundled libibus-1.0-dev libibverbs1 libidn11-dev libimage-exiftool-perl libimage-magick-perl libimage-magick-q16-perl libimobiledevice-utils libimport-into-perl libintl-perl libio-pty-perl libio-string-perl libio-stringy-perl libipc-run-perl libipc-run3-perl libipc-shareable-perl libipc-signal-perl libipc-system-simple-perl libiso9660-dev libiw30 libjaxp1.3-java libjcsp-java libjctools-java libjetty9-extra-java libjetty9-java libjformatstring-java libjline2-java libjna-platform-java libjnr-constants-java libjnr-ffi-java libjpeg-dev libjq1 libjs-angularjs libjs-inherits libjs-jquery-throttle-debounce libjs-lodash libjs-openlayers libjs-prototype libjs-scriptaculous libjson-any-perl libjson-glib-dev libjson-perl libjsr166y-java libkeybinder-3.0-0 libkrb5-dev libkxml2-java liblcms2-dev liblcms2-utils libldap2-dev libldm-1.0-0 liblensfun-data-v1 liblensfun-dev liblensfun1 liblinear-tools liblist-allutils-perl liblist-compare-perl liblist-moreutils-perl liblist-someutils-perl liblist-utilsby-perl liblog-dispatch-perl liblog-log4perl-perl libloudmouth1-0 liblouisutdml-bin liblouisutdml-data liblqr-1-0 libltdl-dev liblua5.1-0 liblua5.2-dev libluajit-5.1-dev liblwpx-paranoidagent-perl liblz4-dev liblzo2-dev libm17n-0 libmad0 libmad0-dev libmail-box-perl libmail-sendmail-perl libmarkdown2 libmath-bigint-perl libmath-round-perl libmaven3-core-java libmbedtls-dev libmcrypt4 libmd0 libmeanwhile1 libmicrohttpd-dev libmime-base64-urlsafe-perl libmime-charset-perl libmime-tools-perl libmime-types-perl libmission-control-plugins0 libmng1 libmodplug-dev libmodule-implementation-perl libmodule-pluggable-perl libmodule-runtime-conflicts-perl libmodule-runtime-perl libmono-addins-gui0.2-cil libmono-addins0.2-cil libmono-cairo4.0-cil libmono-data-tds4.0-cil libmono-i18n-west4.0-cil libmono-i18n4.0-cil libmono-posix4.0-cil libmono-security4.0-cil libmono-sharpzip4.84-cil libmono-simd4.0-cil libmono-sqlite4.0-cil libmono-system-configuration4.0-cil libmono-system-core4.0-cil libmono-system-data4.0-cil libmono-system-drawing4.0-cil libmono-system-enterpriseservices4.0-cil libmono-system-numerics4.0-cil libmono-system-security4.0-cil libmono-system-transactions4.0-cil libmono-system-web-applicationservices4.0-cil libmono-system-web-services4.0-cil libmono-system-web4.0-cil libmono-system-xml4.0-cil libmono-system4.0-cil libmoo-perl libmoose-autobox-perl libmoose-perl libmoosex-has-sugar-perl libmoosex-semiaffordanceaccessor-perl libmoosex-types-perl libmoox-configfromfile-perl libmoox-file-configdir-perl libmoox-late-perl libmoox-options-perl libmouse-perl libmousex-getopt-perl libmousex-types-path-class-perl libmousex-types-perl libmp3-info-perl libmp3-tag-perl libmp3lame-dev libmpd1 libmpdclient2 libmpeg2-4-dev libmro-compat-perl libmultiverse-core-java libnamespace-autoclean-perl libnamespace-clean-perl libncurses5 libnet-bonjour-perl libnet-daemon-perl libnet-dbus-glib-perl libnet-dns-perl libnet-domain-tld-perl libnet-dropbox-api-perl libnet-github-perl libnet-inet6glue-perl libnet-ip-perl libnet-ldap-perl libnet-oauth-perl libnet-openid-common-perl libnet-openid-consumer-perl libnet-rendezvous-publish-backend-avahi-perl libnet-rendezvous-publish-perl libnet-telnet-perl libnetpbm10 libnfs-dev libnginx-mod-http-auth-pam libnginx-mod-http-dav-ext libnginx-mod-http-echo libnginx-mod-http-geoip libnginx-mod-http-image-filter libnginx-mod-http-subs-filter libnginx-mod-http-upstream-fair libnginx-mod-http-xslt-filter libnginx-mod-mail libnginx-mod-stream libnih-dbus1 libnih1 libnl-3-dev libnl-genl-3-dev libnl-route-3-dev libnm0 libnotify-dev libnotmuch-dev libnova-0.16-0 libnumber-compare-perl libobject-realize-later-perl libodbc1 libogg-dev libogg-vorbis-header-pureperl-perl libopenexr-dev libopus-dev libosgi-annotation-java libosip2-dev libosp5 libossp-uuid-perl libossp-uuid16 libotf0 libotr5 libotr5-bin libotr5-dev libots0 libout123-0 libp11-kit-dev libp8-platform-dev libpackage-deprecationmanager-perl libpackage-stash-perl libpackage-stash-xs-perl libpam-gnome-keyring libpam0g-dev libpango-perl libpango1.0-dev libpango1.0-doc libpano13-bin libparams-classify-perl libparams-util-perl libparams-validate-perl libparams-validationcompiler-perl libparse-debcontrol-perl libpasswdqc0 libpath-class-perl libpath-tiny-perl libpathplan4 libpcap0.8-dev libpci-dev libpcre16-3 libpcre3-dev libpcre32-3 libperl6-junction-perl libpixman-1-dev libplexus-component-annotations-java libplexus-component-metadata-java libplexus-container-default1.5-java libplist-dev libplot2c2 libportaudio2 libportmidi0 libpostproc-dev libproc-daemon-perl libproc-invokeeditor-perl libproc-processtable-perl libproc-simple-perl libproc-waitstat-perl libpstoedit0c2a libptexenc1 libpurple-bin libpurple0 libpython2.7-dev libqalculate-doc libqdox2-java librcc0 librcd0 libreadonly-perl librecode0 libregexp-assemble-perl libregexp-common-perl libreoffice-calc libreoffice-gnome libreoffice-impress libreoffice-java-common libreoffice-writer libresid-builder0c2a librole-tiny-perl librpc-xml-perl librrd8 librrds-perl librsvg2-bin librsvg2-dev librtmp-dev libsamplerate0-dev libsane-hpaio libscalar-string-perl libscope-guard-perl libsdl-image1.2 libsdl-mixer1.2 libsdl-ttf2.0-0 libsdl1.2-dev libsdl2-dev libsdl2-image-2.0-0 libsdl2-image-dev libsdl2-mixer-2.0-0 libsdl2-mixer-dev libserf-1-1 libset-scalar-perl libshairport-dev libsidplay2 libsidplay2-dev libsidutils0 libsimple-http-java libsisu-inject-java libsisu-plexus-java libsmbclient-dev libsmi2ldbl libsndio-dev libsoap-lite-perl libsodium-dev libsofia-sip-ua-glib3 libsofia-sip-ua0 libsort-naturally-perl libsort-versions-perl libsoup2.4-dev libsource-highlight-common libsox-fmt-alsa libsox-fmt-base libspandsp-dev libspecio-perl libspeex-dev libspeexdsp-dev libspice-server1 libspring-beans-java libspring-core-java libsqlite3-dev libssh2-1-dev libssl-doc libstrictures-perl libstring-bufferstack-perl libstring-formatter-perl libstring-shellquote-perl libstrongswan-standard-plugins libsub-exporter-formethods-perl libsub-exporter-perl libsub-exporter-progressive-perl libsub-identify-perl libsub-install-perl libsub-name-perl libsub-uplevel-perl libsvm-tools libsvn-dev libsvn-perl libsvn1 libswitch-perl libswresample-dev libswscale-dev libsys-hostname-long-perl libsysfs2 libtag1-dev libtaglibs-standard-impl-java libtaglibs-standard-spec-java libtalloc-dev libtask-weaken-perl libtbb2 libtelepathy-farstream3 libtelepathy-glib0 libtelepathy-logger3 libtemplate-declare-perl libtemplate-perl libterm-readline-gnu-perl libterm-readline-perl-perl libterm-shell-perl libterm-size-any-perl libterm-size-perl libterm-size-perl-perl libtest-exception-perl libtest-fatal-perl libtest-http-server-simple-perl libtest-longstring-perl libtest-script-run-perl libtest-www-mechanize-perl libtexluajit2 libtext-autoformat-perl libtext-csv-perl libtext-csv-xs-perl libtext-glob-perl libtext-markdown-discount-perl libtext-markdown-perl libtext-reform-perl libtext-template-perl libtext-wikicreole-perl libtheora-dev libtie-cache-perl libtiff5-dev libtime-duration-parse-perl libtime-duration-perl libtime-progress-perl libtinfo5 libtinyxml-dev libtokyocabinet9 libtool libtype-tiny-perl libtypes-path-tiny-perl libunicode-linebreak-perl libunicode-string-perl libuniconf4.6 libupnp-dev libusb-0.1-4 libuser-identity-perl libuuid-perl libuuid-tiny-perl libuv1 libuv1-dev libv4l-dev libva-dev libvariable-magic-perl libvcdinfo0 libvde0 libvdeplug2 libvdpau-dev libvirt-clients libvirt-doc libvirtodbc0 libvisual-0.4-plugins libvlc-bin libvlc5 libvorbis-dev libvpx-dev libvte-common libvte-dev libvte9 libvulkan1 libvulkan1:i386 libwant-perl libwayland-bin libwayland-dev libwildmidi-config libwireshark-data libwmf-bin libwmf0.2-7 libwv-1.2-4 libwvstreams4.6-base libwvstreams4.6-extras libwww-mechanize-gzip-perl libwww-mechanize-perl libx11-doc libx11-protocol-other-perl libx11-xcb-dev libx86-1 libxalan2-java libxapian-dev libxcb-dri2-0-dev libxcb-dri3-dev libxcb-glx0-dev libxcb-present-dev libxcb-randr0-dev libxcb-render0-dev libxcb-shape0-dev libxcb-shm0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdelta2 libxenstore3.0 libxerces2-java libxfixes-dev libxi-dev libxine2 libxine2-bin libxine2-ffmpeg libxine2-misc-plugins libxine2-plugins libxine2-x libxkbcommon-dev libxkbfile-dev libxml-atom-simplefeed-perl libxml-commons-external-java libxml-commons-resolver1.1-java libxml-feedpp-perl libxml-namespacesupport-perl libxml-sax-base-perl libxml-sax-expat-perl libxml-sax-perl libxml-simple-perl libxml-treepp-perl libxml-writer-perl libxml2-utils libxmlsec1-dev libxmu-dev libxmu-headers libxshmfence-dev libxtst-dev libxv-dev libxxf86vm-dev libyajl-dev libyaml-libyaml-perl libyaml-perl libyaml-syck-perl libyaml-tiny-perl libzephyr4 libzip4 libzlcore-data libzltext-data link-grammar-dictionaries-en linphone-common linssid lintian linux-image-5.18.0-0.bpo.1-amd64 linux-image-amd64 liquidsoap live-build lm-sensors lmodern lnav lockfile-progs luminance-hdr lvm2 lxrandr lynx lzma m17n-db m4 macchanger maelstrom magic-wormhole maildrop mailscripts make makedev makepasswd mame man2html mandoc marble mate-desktop-environment mbr mc mc-data meld memtest86 mercurial-common mesa-common-dev mesa-utils metar mime-construct minicom miscfiles mkdocs mktorrent moc moc-ffmpeg-plugin module-assistant mono-4.0-gac mono-gac mono-runtime mousepad mp3info mpg123 mpv mscompress msr-tools mswatch mtools mupdf musescore3 nautilus nautilus-extension-brasero nautilus-sendto ncftp nd ndisc6 nec2c neomutt net-tools nethack-common nethack-console netpbm network-manager-dev network-manager-openvpn network-manager-vpnc network-manager-vpnc-gnome nginx nginx-common nginx-doc nginx-full nmon node-amdefine node-balanced-match node-brace-expansion node-builtin-modules node-concat-map node-fs.realpath node-hosted-git-info node-inflight node-is-builtin-module node-isexe node-path-is-absolute node-pseudomap node-source-map node-spdx-correct node-spdx-expression-parse node-spdx-license-ids node-validate-npm-package-license node-wrappy node-yallist notmuch-mutt ntpdate nvme-cli nwipe obs-studio ocaml-base-nox ocaml-findlib ocaml-interp ocrfeeder odbcinst odbcinst1debian2 offlineimap3 okular okular-extra-backends openbsd-inetd opensc-pkcs11 openstack-pkg-tools os-prober osmo oss-compat owx oxygen-icon-theme oz paprefs patch patchutils pbuilder pbzip2 pcmanfm pcmciautils pdf-presenter-console pelican pepper perl-tk perlmagick pflogsumm php-cli php-common php-console-table php-pear php-xml physlock pi picocom pidgin-data pidgin-guifications pidgin-otr pius plymouth-themes pm-utils po-debconf poc-streamer poppler-utils postgresql-client-common powermgmt-base pppoe pppoeconf pqiv preview-latex-style printer-driver-all printer-driver-c2050 printer-driver-c2esp printer-driver-cjet printer-driver-escpr printer-driver-foo2zjs printer-driver-foo2zjs-common printer-driver-fujixerox printer-driver-gutenprint printer-driver-hpcups printer-driver-hpijs printer-driver-m2300w printer-driver-min12xxw printer-driver-pnm2ppa printer-driver-postscript-hp printer-driver-ptouch printer-driver-pxljr printer-driver-sag-gdi printer-driver-splix pristine-tar progress prometheus-node-exporter protobuf-compiler ps2eps pssh pstoedit psutils pulseaudio pulseaudio-module-bluetooth pumpa purifyeps pxlib1 pycodestyle pyflakes3 pypy python-dbus-dev python-flask-doc python-gi-dev python-jinja2 python-jinja2-doc python-markupsafe python-matplotlib-data python-nose2-doc python-tk python2.7-doc python3-acoustid python3-all python3-attr python3-blinker python3-bs4 python3-build python3-cachecontrol python3-cffi python3-cffi-backend python3-characteristic python3-click python3-clustershell python3-colorlog python3-colour python3-constantly python3-cryptography python3-cycler python3-dateparser python3-dev python3-distutils-extra python3-docopt python3-docutils python3-elasticsearch python3-examples python3-feedparser python3-flake8 python3-future python3-geoip python3-git python3-gitdb python3-gitlab python3-gphoto2 python3-hkdf python3-humanfriendly python3-humanize python3-i3ipc python3-importlib-metadata python3-incremental python3-ipython python3-ipython-genutils python3-jinja2 python3-keyring python3-keyrings.alt python3-ldap python3-livereload python3-lockfile python3-lxml python3-markdown python3-matplotlib python3-musicpd python3-newt python3-notebook python3-notify2 python3-openssl python3-pandas python3-pbr python3-pexpect python3-pickleshare python3-pil python3-pilkit python3-ply python3-prompt-toolkit python3-ptyprocess python3-pyasn1-modules python3-pycodestyle python3-pycparser python3-pyflakes python3-pystache python3-pytest-cov python3-pytest-runner python3-pyudev python3-requests-file python3-secretstorage python3-serial python3-service-identity python3-sh python3-smmap python3-socks python3-spake2 python3-tabulate python3-termcolor python3-tqdm python3-traitlets python3-twisted python3-usb python3-venv python3-wcwidth python3-whois python3-xdo python3-zope.interface qemu-system qemu-user qemu-utils qgo qprint qqwing qrencode qtbase5-dev qthid-fcd-controller qttools5-dev-tools quvi r-cran-ggplot2 r-cran-reshape2 radeontool radvd rake rdesktop recode resolvconf restic rhythmbox rhythmbox-plugin-cdrecorder rhythmbox-plugins ristretto roffit rst2pdf rtmpdump ruby ruby-bundler ruby-cairo ruby-deep-merge ruby-dev ruby-did-you-mean ruby-faraday ruby-gettext ruby-html-proofer ruby-kramdown-rfc2629 ruby-locale ruby-minitest ruby-net-telnet ruby-nokogiri ruby-open4 ruby-pkg-config ruby-power-assert ruby-ronn ruby-rspec-puppet ruby-test-unit ruby-text-format rygel-playbin rygel-preferences rygel-tracker sacc samba-common samba-common-bin saytime sc scons scrcpy screenfetch scrot sdate seabios seahorse seahorse-daemon sendxmpp sent sgml-data sharutils shelldap shotwell signify signify-openbsd signify-openbsd-keys signing-party simple-scan simplescreenrecorder slib smartmontools smbclient sockstat sound-juicer sound-theme-freedesktop source-highlight spawn-fcgi sphinx-common sphinx-doc sqlite3 sqlite3-doc squid-deb-proxy-client ssh-askpass ssh-audit sshuttle ssl-cert startpar steam:i386 stellarium-data stress stress-ng strip-nondeterminism strongswan suckless-tools sudoku svn-buildpackage sweethome3d swig swish++ symlinks synaptic syncthing sysfsutils syslinux syslinux-common system-config-printer-common system-config-printer-udev sysuser-helper sysv-rc sysv-rc-conf tango-icon-theme tasksel taskwarrior tcl tcpd telepathy-haze telepathy-idle telepathy-logger telepathy-mission-control-5 telepathy-rakia telepathy-salut tellico tellico-data tellico-scripts telnet tesseract-ocr tex-common texlive texlive-base texlive-bibtex-extra texlive-binaries texlive-extra-utils texlive-font-utils texlive-fonts-extra texlive-fonts-recommended texlive-fonts-recommended-doc texlive-lang-french texlive-latex-base-doc texlive-latex-extra-doc texlive-latex-recommended-doc texlive-metapost texlive-metapost-doc texlive-pictures texlive-pictures-doc texlive-pstricks texlive-pstricks-doc texlive-xetex tftp-hpa tftpd thunar-archive-plugin thunar-data thunar-media-tags-plugin thunar-volman tidy tig tipa tk tla tla-doc tmate toilet-fonts tor-geoipdb torsocks totem totem-plugins traceroute tracker transgui translate-shell transmission transmission-cli transmission-gtk transmission-qt-dbgsym trustedqsl tsocks uhd-host uhubctl unicode-data units unixodbc unp unrar-free uuid v4l-utils va-driver-all vacation vagrant-cachier vagrant-libvirt vagrant-sshfs valac vbetool vbindiff vde2 vgabios viking vim-runtime vinagre vino virt-manager virtualenvwrapper virtuoso-minimal visidata vlan vlc-bin vlc-data vlc-l10n vlc-plugin-base vlc-plugin-notify vlc-plugin-video-output vlc-plugin-video-splitter vlc-plugin-visualization vlock vnstat vorbis-tools vorbisgain vpnc vulkan-tools:i386 w3c-linkchecker w3m wamerican wayland-protocols wdiff weechat weechat-doc weechat-scripts wfrench whipper whohas wipe wireshark wireshark-common workrave-data wvdial wwwconfig-common x11-apps x11-session-utils x11-xfs-utils x11proto-record-dev x11proto-xf86vidmode-dev x11vnc xaos xapian-doc xapian-examples xapian-omega xapian-tools xautolock xbase-clients xbindkeys xboard xclip xdelta xdelta3 xdg-user-dirs-gtk xfburn xfce4 xfce4-appfinder xfce4-battery-plugin xfce4-clipman xfce4-clipman-plugin xfce4-cpufreq-plugin xfce4-cpugraph-plugin xfce4-datetime-plugin xfce4-dict xfce4-diskperf-plugin xfce4-fsguard-plugin xfce4-genmon-plugin xfce4-goodies xfce4-mailwatch-plugin xfce4-mount-plugin xfce4-netload-plugin xfce4-panel xfce4-places-plugin xfce4-pulseaudio-plugin xfce4-screenshooter xfce4-sensors-plugin xfce4-smartbookmark-plugin xfce4-systemload-plugin xfce4-taskmanager xfce4-timer-plugin xfce4-verve-plugin xfce4-wavelan-plugin xfce4-weather-plugin xfce4-xkb-plugin xfonts-100dpi xfonts-75dpi xfonts-scalable xgnokii xine-ui xininfo xinit xli xloadimage xml-core xml2rfc xmlto xmms2-plugin-daap xnec2c xorg xorg-docs xorg-docs-core xpdf xplanet-images xpra xsane-common xscreensaver-data xscreensaver-data-extra xsltproc xtrace xtrlock xvfb xxd yasm yelp yubioath-desktop zathura zeitgeist-core zenity zip zonemaster-cli zsh
-    popcon stats not available: [Errno 2] No such file or directory: '/var/log/popularity-contest'
-
-OMFG. 1868 packages. Life is too short to get through all of
-this. YOLO, and I guess I'll live with the repeated "aargh why isn't
-this installed" problem and just deal with this as I go along. The
-biggest problem is probably missing configuration (i.e. most of
-`/etc`) and that's something I can probably restore from backups as I
-find missing bits.
-
-Actual bits to consider: macchanger smartmontools vnstat? tellico
+install and then I had a good base setup, although not exactly as it
+was before. 1700 packages were installed manually on `angela` before
+the reinstall, and not in Puppet.
+
+I did not inspect each one individually, but I did go through `/etc`
+and copied over more SSH keys, for backups and [SMTP over SSH](https://gitlab.com/anarcat/rsendmail).
 
 ## LVFS support
 

fix broken header
diff --git a/services/mail.mdwn b/services/mail.mdwn
index 2a1d66b8..7275b4d1 100644
--- a/services/mail.mdwn
+++ b/services/mail.mdwn
@@ -426,7 +426,7 @@ needs to be able to check the TLS policy (which it could do with
 the daemon itself. Thankfully, there's a third-party daemon called
 [postfix-mta-sts-resolver](https://pypi.org/project/postfix-mta-sts-resolver/) which can do this. Unfortunately it
 wasn't in Debian when I worked on this (since then solved, see [bug
-#917366](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=917366)) so I didn't get to deploy that just yet.
+917366](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=917366)) so I didn't get to deploy that just yet.
 
 References:
 

fix div parsing
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 09adc756..0a5d7e63 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -639,7 +639,7 @@ the:
    firmware, normally shipped in the [[!debpkg firmware-misc-nonfree]]
    but currently missing from the package
 
-<div class="warning">
+<span /><div class="warning">
 Note that, at the time of writing, the [latest i915 firmware from
 linux-firmware](https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/tree/i915?id=51fff4e69b4554dd3fee21e3c55a0f94937293e3) does have a *serious* bug where loading *all* the
 accessible firmware results in noticeable — I estimate 200-500ms — lag
@@ -661,7 +661,7 @@ Thanks to [EmanueleRocca](https://wiki.debian.org/EmanueleRocca) for figuring th
 discussion about power management on the Framework forum](https://community.frame.work/t/12th-gen-power-management-on-linux/21330).
 </div>
 
-<div class="note">
+<span /><div class="note">
 Also note that the iwlwifi firmware also looks incomplete. Even with
 the package installed, I get those errors in dmesg:
 

toc levels
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 869aeb30..09adc756 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -33,7 +33,7 @@ need a dock.
 
 Read on for the detailed review.
 
-[[!toc]]
+[[!toc levels=5]]
 
 # Current status
 

add a summary, reorder, more details
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index b46bab17..869aeb30 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -6,63 +6,48 @@ repairable, scoring an "exceedingly rare" [10/10 score from
 ifixit.com](https://www.ifixit.com/News/51614/framework-laptop-teardown-10-10-but-is-it-perfect).
 
 There are two generations of the laptop's main board (both compatible
-with the same body of course), the Intel 11th and 12th gen chipsets. I
-have ordered the 12th generation "DIY" device in late August 2022 and
-will update this page as I go along in the process of ordering,
-burning-in, setting up and using the device over the years.
+with the same body of course), the Intel 11th and 12th gen chipsets. 
 
-# Current status
-
-I have the framework! I'm struggling with the UEFI configuration (had
-to reinstall Debian), but I'll get there.
-
-See also the bottom of the page for last update date for this specific
-page.
+I have received my Framework, 12th generation "DIY", device in late
+September 2022 and will update this page as I go along in the process
+of ordering, burning-in, setting up and using the device over the
+years.
 
-## The supply pipeline
-
-There are basically 6 steps in the Framework shipping pipeline, each
-(except the last) accompanied with an email notification:
-
- 1. pre-order
- 2. preparing batch
- 3. preparing order
- 4. payment complete
- 5. shipping
- 6. (received)
+Overall, the Framework is a good laptop. I like the keyboard, the
+touchpad, the expansion cards (although I wish there were more
+ports). Clearly there's been some good work done on industrial design,
+and it's the most repairable laptop I've had in years. Time will tell,
+but it looks sturdy enough to survive me many years as well.
 
-This comes from the [crowdsourced spreadsheet](https://docs.google.com/spreadsheets/d/10bhWkvOnaLhFG7RsZmb0uwKo4F8tBJWlTqXToUyIDX0/edit#gid=1658320056), which should be
-updated when the status changes here.
+On the downside, it has serious power management issues. There's a lot
+of proprietary firmware required (WiFi, Bluetooth, some graphics) and
+the Framework ships with a proprietary BIOS, with currently no
+Coreboot support. Expect to need the latest kernel, firmware, and
+hacking around a bunch of things to get resolution and keybindings to
+get the laptop to work right. Don't expect week-long suspend, or full
+day battery.
 
-I was part of the "third batch" of the 12th generation laptop, which
-was supposed to ship in September. It ended up arriving on my door
-step on September 27th which is pretty good considering they had
-delays in the second batch (August).
+Finally, the expansion ports are nice, but there's only four of
+them. If you plan to have a two-monitor setup, you're likely going to
+need a dock.
 
-## Shipping trivia
+Read on for the detailed review.
 
-I don't know about the others, but my laptop shipped through no less
-than *four* different airplane flights. Here are the hops it took:
+[[!toc]]
 
- * [Taoyuan, Taiwan](https://en.wikipedia.org/wiki/Taoyuan,_Taiwan) 2022-09-23
- * [Anchorage, Alaska, USA](https://en.wikipedia.org/wiki/Anchorage,_Alaska) (?!) 2022-09-24
- * [Memphis, Tennessee, USA](https://en.wikipedia.org/wiki/Memphis,_Tennessee) 2022-09-25
- * [Winnipeg, Manitoba, Canada](https://en.wikipedia.org/wiki/Winnipeg) (!! back the wrong way!) 2022-09-26
- * [Mirabel, Québec, Canada](https://en.wikipedia.org/wiki/Montr%C3%A9al%E2%80%93Mirabel_International_Airport) 2022-09-27
- * [Montréal, Québec, Canada](https://en.wikipedia.org/wiki/Montreal)
+# Current status
 
-I can't quite figure out how to calculate exactly how much mileage
-that is, but it's huge. The ride through Alaska is surprising enough
-but the bounce back through *Winnipeg* is especially weird. I guess
-the route happens that way because of Fedex shipping hubs.
+I have the framework! It's setup with a fresh new Debian bookworm
+installation.
 
-There was a related oddity when I had my Purism laptop shipped: it
-left from the west coast and seemed to enter on an endless, two week
-long road trip across the continental US.
+See also the bottom of the page for last update date for this specific
+page.
 
 # Specifications
 
- * CPU:  i5-1240P (Up to 4.4 GHz, 4+8 cores), Iris Xe graphics
+Those are the specifications of the 12th 
+
+ * CPU:  i5-1240P,  i7-1260P, or i7-1280P (Up to 4.4-4.8 GHz, 4+8 cores), Iris Xe graphics
  * Storage: 250-4000GB NVMe (or bring your own)
  * Memory: 8-64GB DDR4-3200 (or bring your own)
  * WiFi 6e (AX210, vPro optional, or bring your own)
@@ -80,16 +65,16 @@ long road trip across the continental US.
  * Battery: 55Wh
  * Camera: 1080p 60fps
  * Biometrics: Fingerprint Reader
- * Keyboard Backlit
+ * Backlit keyboard
  * Power Adapter: 60W USB-C (or bring your own)
- * ships with a screwdriver
+ * ships with a screwdriver/spludget
  * 1 year warranty
  * base price: 1000$CAD, but doesn't give you much, typical builds
    around 1500-2000$CAD
 
 # Actual build
 
-This is the build I ordered.
+This is the actual build I ordered.
 
 ## base configuration
 
@@ -120,19 +105,28 @@ This is the build I ordered.
  * After tax and duties: 1847$
  * Free shipping
 
-# Pros
+# Quick evaluation
+
+This is basically the TL;DR: here, just focusing on broad pros/cons of
+the laptop.
+
+## Pros
 
- * 11th gen seems easily repairable (qrcodes pointing to [repair
-   guides](https://guides.frame.work/c/Framework_Laptop)!), [10/10 score from ifixit.com](https://www.ifixit.com/News/51614/framework-laptop-teardown-10-10-but-is-it-perfect), which they call
-   "exceedingly rare", the 12th gen has a similar design and would
-   probably rate similarly
+ * seems easily repairable (qrcodes pointing to [repair guides](https://guides.frame.work/c/Framework_Laptop)!),
+   the 11th gen received a [10/10 score from ifixit.com](https://www.ifixit.com/News/51614/framework-laptop-teardown-10-10-but-is-it-perfect), which
+   they call "exceedingly rare", the 12th gen has a similar hardware
+   design and would probably rate similarly
+
+ * replaceable mainboard!!! can be reused as a NUC-like device, with a
+   [3d-printed case](https://github.com/FrameworkComputer/Mainboard), 12th gen board can be bought standalone and
+   retrofitted into an 11th gen case
 
  * four modular USB-C ports which can fit HDMI, USB-C (pass-through,
    can provide power on both sides), USB-A, DisplayPort, MicroSD,
    external storage (250GB, 1TB), [active modding community](https://community.frame.work/c/expansion-cards/developer-program/90)
 
- * replaceable mainboard!!! can be reused as a NUC-like device, with a
-   [3d-printed case](https://github.com/FrameworkComputer/Mainboard)
+ * nice power led indicating power level (charging, charged, etc) when
+   plugged
 
  * [test account on fwupd.org](https://fwupd.org/lvfs/vendors/#framework), "expressed interest to port to
    coreboot" (according to the Fedora developer) and [are testing
@@ -145,14 +139,15 @@ This is the build I ordered.
  * [excellent documentation of the (proprietary) BIOS](https://community.frame.work/t/bios-guide/4178/1)
 
  * explicitly linux support with [install guides](https://frame.work/ca/en/linux), although you'll
-   have to live with a bit of proprietary firmware
+   have to live with a bit of proprietary firmware, and not everything
+   works correctly
 
  * the 11th gen had good reviews: [Ars Technica](https://arstechnica.com/gadgets/2021/07/frameworks-new-lightweight-modular-laptop-delivers-on-its-promises/), [Fedora
    developer](https://www.scrye.com/wordpress/nirik/2021/08/29/frame-work-laptop-the-hyperdetailed-fedora-review/), [iFixit teardown](https://www.ifixit.com/News/51614/framework-laptop-teardown-10-10-but-is-it-perfect), [phoronix](https://www.phoronix.com/scan.php?page=article&item=framework-laptop&num=1), amazing
    keyboard and touchpad, according to [Linux After Dark][linux-after-dark-framework] ; more
-   critical review: [OpenBSD developer](https://jcs.org/2021/08/06/framework)
+   critical review from an[OpenBSD developer](https://jcs.org/2021/08/06/framework)
 
-# Cons
+## Cons
 
  * the 11th gen is out of stock, except for the higher-end CPUs, which
    are much less affordable (700$+)
@@ -428,7 +423,32 @@ much more modern the Framework is, however, this is a little
 disappointing as well.
 
 The power problems were already present in the 11th gen, according to
-[this report from Linux After Dark][linux-after-dark-framework], so this is not a new problem.
+[this report from Linux After Dark][linux-after-dark-framework], so this is not a new
+problem. I have tried to follow some of the tips in [this forum
+post](https://community.frame.work/t/linux-battery-life-tuning/6665). The tricks `powertop --auto-tune` and `tlp`'s
+`PCIE_ASPM_ON_BAT=powersupersave` basically do nothing: I'm stuck at
+10W power usage in powertop (600+mA in `tlp-stat`).
+
+Apparently, I should be able to reach the `C8` CPU power state (or
+even `C9`, `C10`) in powertop, but I seem to be stock at
+`C7`. (Although I'm not sure how to read that tab in powertop: in the
+`Core(HW`) column there's only C3/C6/C7 states, and most cores are 85%
+in C7 or maybe C6. But the next column over *does* show many CPUs in
+C10 states...
+
+This could be a problem with my desktop configuration: I have this
+silly status bar that updates every second and probably causes
+redraws... The CPU certainly doesn't spin down below 1GHz. Also note
+that this is with an actual desktop running with everything: it could
+very well be that some things (I'm looking at you Signal Desktop) take
+up unreasonable amount of power on their own (hello, 1W/electron,
+sheesh). (Syncthing and containerd (Docker!) also each take a good 500mW
+just sitting there.)
+

(Diff truncated)
fix closing div
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 6f0bb0f2..b46bab17 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -640,7 +640,7 @@ it means the problematic firmware is disabled:
 
 Thanks to [EmanueleRocca](https://wiki.debian.org/EmanueleRocca) for figuring that one out. See also [this
 discussion about power management on the Framework forum](https://community.frame.work/t/12th-gen-power-management-on-linux/21330).
-</dev>
+</div>
 
 <div class="note">
 Also note that the iwlwifi firmware also looks incomplete. Even with

test expansion ports power usage, reorder
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 5446b5e2..6f0bb0f2 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -414,11 +414,8 @@ proper power savings. The [firmware updates for various chipsets](https://news.y
 are supposed to improve things eventually, but I will believe this
 when I get there.
 
-The battery is certainly not up to, say, Dell XPS 13, Thinpad X1, and
-of course not the Apple M1. The power problems were already present in
-the 11th gen, according to [this report from Linux After Dark][linux-after-dark-framework]
-which also mentions that the USB adapters take power *even when not in
-use* and quite a bit (400mW in some cases!).
+The battery life is certainly not up to, say, Dell XPS 13, Thinpad X1, and
+of course not the Apple M1.
 
 ## Power management
 
@@ -430,6 +427,9 @@ without any active expansion card, except the storage. Considering how
 much more modern the Framework is, however, this is a little
 disappointing as well.
 
+The power problems were already present in the 11th gen, according to
+[this report from Linux After Dark][linux-after-dark-framework], so this is not a new problem.
+
 ## Standby battery usage
 
 I wrote some [[quick hack to evaluate how much power is used during
@@ -515,6 +515,41 @@ disruptive than regular sleep. As you can see by the timing, it took
 more than 10 seconds for the laptop to resume, which feels a little
 alarming as your banging the keyboard to bring it back to life.
 
+## Expansion ports
+
+I ordered a bunch of expansion ports, a total of 10. I have actually
+not used all of them yet, but I did manage to initialize the 1TB drive
+as an encrypted storage, mostly to keep photos as this is something
+that takes a massive amount of space (500GB and counting) and that I
+(unfortunately) don't work on very often (but still carry around).
+
+The expansion ports are fancy and nice, but not actually that
+convenient. They're hard to take out, you really need to crimp your
+fingernails on there and pull hard to take them out. There's a little
+button next to them to release, I think, but it still feels a little
+scary to pull those pucks out of there.
+
+And there's *only* four expansion ports after all. Once you have two
+monitors, the drive and power plugged in, bam, you're out of ports and
+there's nowhere to plug my Yubikey. So if this is going to be my daily
+driver, with a dual monitor setup, I will need a dock, which means
+more crap firmware and uncertainty, which isn't great.
+
+Still, I really like that idea that I can carry all those little
+adapters in a pouch when I travel and can basically do anything I
+want, really nice.
+
+Interestingly, I could *not* reproduce the power usage of the
+expansion ports when idle. I tried plugging in the HDMI and
+DisplayPort adapters, and none of them raised the power usage above
+what the normal CPU throttling would fluctuate around
+(600-750mA). Surprisingly, the 1TB disk also doesn't seem to drain the
+battery either when idle, or at least not above a few mA (say
+30-50mA?), same with the MicroSD card reader.
+
+I suspect some firmware updates have actually fixed the issues with
+the expansion ports power savings, which is certainly nice.
+
 ## USB-C charging
 
 One thing that is really a game changer for me is USB-C charging. It's
@@ -570,30 +605,6 @@ The keyboard backlight can be cycled with <kbd>fn-space</kbd>. The
 dimmer version is dim enough, and the keybinding is easy to find in
 the dark.
 
-## Expansion ports
-
-I ordered a bunch of expansion ports, a total of 10. I have actually
-not used all of them yet, but I did manage to initialize the 1TB drive
-as an encrypted storage, mostly to keep photos as this is something
-that takes a massive amount of space (500GB and counting) and that I
-(unfortunately) don't work on very often (but still carry around).
-
-The expansion ports are fancy and nice, but not actually that
-convenient. They're hard to take out, you really need to crimp your
-fingernails on there and pull hard to take them out. There's a little
-button next to them to release, I think, but it still feels a little
-scary to pull those pucks out of there.
-
-And there's *only* four expansion ports after all. Once you have two
-monitors, the drive and power plugged in, bam, you're out of ports and
-there's nowhere to plug my Yubikey. So if this is going to be my daily
-driver, with a dual monitor setup, I will need a dock, which means
-more crap firmware and uncertainty, which isn't great.
-
-Still, I really like that idea that I can carry all those little
-adapters in a pouch when I travel and can basically do anything I
-want, really nice.
-
 ## Proprietary firmware blobs
 
 The framework does need proprietary firmware to operate. Specifically,
@@ -756,7 +767,6 @@ TODO: find the equivalent of this GNOME hack (`gsettings set org.gnome.mutter ex
  - TODO: merge those tips in the Debian wiki page
  - TODO: try more power management tricks in https://community.frame.work/t/linux-battery-life-tuning/6665
 
-
 # Other resources
 
  * [list of compatible USB-C docks](https://community.frame.work/t/usb-c-thunderbolt-dock-megathread/1460) but beware of the above

similar tricks to puppet
diff --git a/blog/2022-09-29-optimizing-puppet-bootstrap.md b/blog/2022-09-29-optimizing-puppet-bootstrap.md
index 78f556dc..bf5bf308 100644
--- a/blog/2022-09-29-optimizing-puppet-bootstrap.md
+++ b/blog/2022-09-29-optimizing-puppet-bootstrap.md
@@ -146,4 +146,29 @@ In any case, I have that gut feeling it's faster, so you'll have to
 just trust my gut. It is, after all, [much more important than you
 might think](https://en.wikipedia.org/wiki/Human_microbiome).
 
+# Similar work
+
+The [blueprint system](http://devstructure.com/blueprint/) is something similar to this:
+
+> It figures out what you’ve done manually, stores it locally in a Git
+> repository, generates code that’s able to recreate your efforts, and
+> helps you deploy those changes to production
+
+That tool has unfortunately been abandoned for a decade at this point.
+
+Also note that the `AutoRemove::RecommendsImportant` and
+`AutoRemove::SuggestsImportant` are relevant here. If it is set to
+true (the default), a package will not be removed if it is
+(respectively) a `Recommends` or `Suggests` of another package (as
+opposed to the normal `Depends`). In other words, if you want to also
+auto-remove packages that are only `Suggests`, you would, for example,
+add this to `apt.conf`:
+
+    AutoRemove::SuggestsImportant false;
+
+Paul Wise has tried to make the Debian installer and debootstrap
+properly mark packages as automatically installed in the past, but his
+bug reports were rejected. The other suggestions in this section are
+also from Paul, thanks!
+
 [[!tag debian puppet debian-planet hack]]

more power usage notes
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index c6bdc2ea..5446b5e2 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -490,7 +490,7 @@ minute).
 [This guide](https://guides.frame.work/Guide/Fedora+36+Installation+on+the+Framework+Laptop/108?lang=en#s655) also suggests booting with `nvme.noacpi=1` but this
 still gives me about 5mAh/min (or 300mA). 
 
-Adding `mem_sleep_default=deep` to the kernel command line does make a
+Adding `mem_sleep_default=deep` to the [kernel command line](https://www.kernel.org/doc/Documentation/power/states.txt) does make a
 difference. Before:
 
     sep 29 23:03:11 angela systemd-sleep[3699]: /sys/class/power_supply/BAT1/charge_now                     =   2544 [mAh]
@@ -500,9 +500,15 @@ difference. Before:
     sep 29 23:04:25 angela systemd-sleep[4039]: /sys/class/power_supply/BAT1/charge_now                     =   2542 [mAh]
 
 ... which is 2mAh in 74 seconds, which is 97mA, brings us to a more
-reasonable 36 hours, or a day and a half. It's still far from a normal
-power usage, and I wish this would be something the Framework project
-would really prioritize at this point.
+reasonable 36 hours, or a day and a half. It's still above the x220
+power usage, and more than an order of magnitude more than the Purism
+laptop.
+
+So it's still far from a normal power usage, and I wish this would be
+something the Framework project would really prioritize at this
+point. There *is* some hope that the [Chromebook edition](https://frame.work/at/en/blog/introducing-the-framework-laptop-chromebook-edition) —
+specifically designed with a specification of 14 days standby time —
+could bring some firmware improvements back down to the normal line.
 
 It should also be noted that the "deep" sleep mode is a little more
 disruptive than regular sleep. As you can see by the timing, it took

someone actually wrote their own tool already
diff --git a/blog/2022-09-28-suspend-battery-use.md b/blog/2022-09-28-suspend-battery-use.md
index 939fe4a5..0f45d3bf 100644
--- a/blog/2022-09-28-suspend-battery-use.md
+++ b/blog/2022-09-28-suspend-battery-use.md
@@ -122,4 +122,9 @@ Obviously, an improvement could be to actually write this to a file,
 do the math and log only that. But that's more work and I'm lazy right
 now, exercise for the reader I guess.
 
+Update: someone actually wrote a full [Python/SQLite implementation of
+this](https://github.com/lhl/batterylog) already, which does all the computations above, although it's
+hardcoded for the Framework laptop and will not necessarily work out
+of the box with other systems.
+
 [[!tag hardware hack]]

the plot thickens on the broken URL
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 8d06a9de..c6bdc2ea 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -245,9 +245,20 @@ is a 404. :)
 
 I was expecting that bar code to lead me to an introduction page,
 something like "how to setup your Framework laptop". Support actually
-confirmed that it should point a [quickstart guide](https://guides.frame.work/Guide/Framework\+Laptop\+DIY\+Edition\+Quick\+Start\+Guide/57), but the link
-they sent me was *also* broken. So definitely an area that could be
-improved, to say the least.
+confirmed that it should point a [quickstart guide](https://guides.frame.work/Guide/Framework+Laptop+DIY+Edition+Quick+Start+Guide/57).  But in a
+bizarre twist, they somehow sent me the URL with the plus (`+`) signs
+escaped, like this:
+
+https://guides.frame.work/Guide/Framework\+Laptop\+DIY\+Edition\+Quick\+Start\+Guide/57
+
+... which Firefox immediately transforms in:
+
+https://guides.frame.work/Guide/Framework/+Laptop/+DIY/+Edition/+Quick/+Start/+Guide/57
+
+I'm puzzled as to why they would send the URL that way, the proper URL
+is of course:
+
+https://guides.frame.work/Guide/Framework+Laptop+DIY+Edition+Quick+Start+Guide/57
 
 (They have also "let the team know about this for feedback and help
 resolve the problem with the link" which is a support code word for

yep, the battery use is really kind of crap
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 24d86307..8d06a9de 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -409,6 +409,16 @@ the 11th gen, according to [this report from Linux After Dark][linux-after-dark-
 which also mentions that the USB adapters take power *even when not in
 use* and quite a bit (400mW in some cases!).
 
+## Power management
+
+Compared to the Purism Librem 13v4, the ongoing power usage seems to
+be slightly better. An anecdotal metric is that the Purism would take
+800mA idle, while the more powerful Framework manages a little over
+600mA as I'm typing this, fluctuating between 600 and 650mA. That is
+without any active expansion card, except the storage. Considering how
+much more modern the Framework is, however, this is a little
+disappointing as well.
+
 ## Standby battery usage
 
 I wrote some [[quick hack to evaluate how much power is used during
@@ -426,9 +436,8 @@ went from this:
 
     sep 28 11:29:47 angela systemd-sleep[209725]: /sys/class/power_supply/BAT/charge_now                      =   6037 [mAh]
 
-That's 8mAh per 10 minutes (and 2 seconds), or 48mAh per hour, or,
-with this battery, about 127 hours or roughly 5 days of standby. Not
-bad!
+That's 8mAh per 10 minutes (and 2 seconds), or 48mA, or, with this
+battery, about 127 hours or roughly 5 days of standby. Not bad!
 
 In comparison, here is my really old x220, before:
 
@@ -438,10 +447,10 @@ In comparison, here is my really old x220, before:
 
     sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/energy_now                     =   4980 [mWh]
 
-... which is 90 mwH in 10 minutes, or a whopping 540mAh per hour,
-which was fine when this battery was new (62000 mAh, so about 100
-hours, or about 5 days), but this battery is almost dead and has
-*only* 5210 mAh when full, so only 10 hours standby.
+... which is 90 mwH in 10 minutes, or a whopping 540mA, which was fine
+when this battery was new (62000 mAh, so about 100 hours, or about 5
+days), but this battery is almost dead and has *only* 5210 mAh when
+full, so only 10 hours standby.
 
 And here is the Framework performing a similar test, before:
 
@@ -453,9 +462,9 @@ And here is the Framework performing a similar test, before:
     sep 29 22:37:08 angela systemd-sleep[4743]: /sys/class/power_supply/BAT1/charge_now                     =   2812 [mAh]
 
 ... which is 49mAh in a little over 10 minutes (and 4 seconds), or
-292mAh per hour, much more than the Purism, but half of the X220. At
-this rate, the battery would last on standby *only* 12 hours!! That is
-pretty bad.
+292mA, much more than the Purism, but half of the X220. At this rate,
+the battery would last on standby *only* 12 hours!! That is pretty
+bad.
 
 Note that this was done with the following expansion cards:
 
@@ -467,9 +476,27 @@ Preliminary tests without the hub (over one minute) show that it
 doesn't significantly affect this power consumption (5 mAh per
 minute).
 
-TODO: test before/after `nvme.noacpi=1`, see [this guide](https://guides.frame.work/Guide/Fedora+36+Installation+on+the+Framework+Laptop/108?lang=en#s655)
+[This guide](https://guides.frame.work/Guide/Fedora+36+Installation+on+the+Framework+Laptop/108?lang=en#s655) also suggests booting with `nvme.noacpi=1` but this
+still gives me about 5mAh/min (or 300mA). 
+
+Adding `mem_sleep_default=deep` to the kernel command line does make a
+difference. Before:
 
-TODO: more power management tricks in https://community.frame.work/t/linux-battery-life-tuning/6665/1
+    sep 29 23:03:11 angela systemd-sleep[3699]: /sys/class/power_supply/BAT1/charge_now                     =   2544 [mAh]
+
+... after:
+
+    sep 29 23:04:25 angela systemd-sleep[4039]: /sys/class/power_supply/BAT1/charge_now                     =   2542 [mAh]
+
+... which is 2mAh in 74 seconds, which is 97mA, brings us to a more
+reasonable 36 hours, or a day and a half. It's still far from a normal
+power usage, and I wish this would be something the Framework project
+would really prioritize at this point.
+
+It should also be noted that the "deep" sleep mode is a little more
+disruptive than regular sleep. As you can see by the timing, it took
+more than 10 seconds for the laptop to resume, which feels a little
+alarming as your banging the keyboard to bring it back to life.
 
 ## USB-C charging
 
@@ -710,6 +737,8 @@ TODO: find the equivalent of this GNOME hack (`gsettings set org.gnome.mutter ex
  - TODO: consider throwing i3 config in puppet /etc/i3/config
  - TODO: other manual conf: adduser anarcat sudo
  - TODO: merge those tips in the Debian wiki page
+ - TODO: try more power management tricks in https://community.frame.work/t/linux-battery-life-tuning/6665
+
 
 # Other resources
 

hub is probably not the problem
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 1fdbcdff..24d86307 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -463,7 +463,9 @@ Note that this was done with the following expansion cards:
  * 1 1TB thumb drive
  * 1 USB-A with a hub connected to it, with keyboard and LAN
 
-TODO: perform another test without the hub
+Preliminary tests without the hub (over one minute) show that it
+doesn't significantly affect this power consumption (5 mAh per
+minute).
 
 TODO: test before/after `nvme.noacpi=1`, see [this guide](https://guides.frame.work/Guide/Fedora+36+Installation+on+the+Framework+Laptop/108?lang=en#s655)
 

fix calculations, it's actually worse
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index eb9625ba..1fdbcdff 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -452,10 +452,12 @@ And here is the Framework performing a similar test, before:
 
     sep 29 22:37:08 angela systemd-sleep[4743]: /sys/class/power_supply/BAT1/charge_now                     =   2812 [mAh]
 
-... which is 49mAh in a little over 10 minutes (and 4 seconds), much
-more than the Purism, but half of the X220. At this rate, the battery
-would last on standby *only* 72 hours, or barely 3 days. Note that
-this was done with the following expansion cards:
+... which is 49mAh in a little over 10 minutes (and 4 seconds), or
+292mAh per hour, much more than the Purism, but half of the X220. At
+this rate, the battery would last on standby *only* 12 hours!! That is
+pretty bad.
+
+Note that this was done with the following expansion cards:
 
  * 2 USB-C
  * 1 1TB thumb drive

test was probably bad because hub
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index d8b19f35..eb9625ba 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -454,7 +454,14 @@ And here is the Framework performing a similar test, before:
 
 ... which is 49mAh in a little over 10 minutes (and 4 seconds), much
 more than the Purism, but half of the X220. At this rate, the battery
-would last on standby *only* 72 hours, or barely 3 days.
+would last on standby *only* 72 hours, or barely 3 days. Note that
+this was done with the following expansion cards:
+
+ * 2 USB-C
+ * 1 1TB thumb drive
+ * 1 USB-A with a hub connected to it, with keyboard and LAN
+
+TODO: perform another test without the hub
 
 TODO: test before/after `nvme.noacpi=1`, see [this guide](https://guides.frame.work/Guide/Fedora+36+Installation+on+the+Framework+Laptop/108?lang=en#s655)
 

digest framework numbers
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index d95fd4e4..d8b19f35 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -445,37 +445,16 @@ hours, or about 5 days), but this battery is almost dead and has
 
 And here is the Framework performing a similar test, before:
 
-    sep 29 22:27:04 angela systemd-sleep[4515]: +++ Battery Status: BAT1
-    sep 29 22:27:04 angela systemd-sleep[4515]: /sys/class/power_supply/BAT1/manufacturer                   = NVT
-    sep 29 22:27:04 angela systemd-sleep[4515]: /sys/class/power_supply/BAT1/model_name                     = Framewo
-    sep 29 22:27:04 angela systemd-sleep[4515]: /sys/class/power_supply/BAT1/cycle_count                    =      1
-    sep 29 22:27:04 angela systemd-sleep[4515]: /sys/class/power_supply/BAT1/charge_full_design             =   3572 [mAh]
     sep 29 22:27:04 angela systemd-sleep[4515]: /sys/class/power_supply/BAT1/charge_full                    =   3518 [mAh]
     sep 29 22:27:04 angela systemd-sleep[4515]: /sys/class/power_supply/BAT1/charge_now                     =   2861 [mAh]
-    sep 29 22:27:04 angela wpa_supplicant[1001]: wlan0: CTRL-EVENT-DSCP-POLICY clear_all
-    sep 29 22:27:04 angela wpa_supplicant[1001]: nl80211: deinit ifname=wlan0 disabled_11b_rates=0
-    sep 29 22:27:04 angela systemd-sleep[4515]: /sys/class/power_supply/BAT1/current_now                    =    633 [mA]
-    sep 29 22:27:04 angela systemd-sleep[4515]: /sys/class/power_supply/BAT1/status                         = Discharging
-    sep 29 22:27:04 angela systemd-sleep[4515]: /sys/class/power_supply/BAT1/charge_control_start_threshold = (not available)
-    sep 29 22:27:04 angela systemd-sleep[4515]: /sys/class/power_supply/BAT1/charge_control_end_threshold   = (not available)
-    sep 29 22:27:04 angela systemd-sleep[4706]: Charge                                                      =   81.3 [%]
-    sep 29 22:27:04 angela systemd-sleep[4707]: Capacity                                                    =   98.5 [%]
 
 ... after:
 
-    sep 29 22:37:08 angela systemd-sleep[4743]: +++ Battery Status: BAT1
-    sep 29 22:37:08 angela systemd-sleep[4743]: /sys/class/power_supply/BAT1/manufacturer                   = NVT
-    sep 29 22:37:08 angela systemd-sleep[4743]: /sys/class/power_supply/BAT1/model_name                     = Framewo
-    sep 29 22:37:08 angela systemd-sleep[4743]: /sys/class/power_supply/BAT1/cycle_count                    =      1
-    sep 29 22:37:08 angela systemd-sleep[4743]: /sys/class/power_supply/BAT1/charge_full_design             =   3572 [mAh]
-    sep 29 22:37:08 angela systemd-sleep[4743]: /sys/class/power_supply/BAT1/charge_full                    =   3518 [mAh]
     sep 29 22:37:08 angela systemd-sleep[4743]: /sys/class/power_supply/BAT1/charge_now                     =   2812 [mAh]
-    sep 29 22:37:08 angela systemd-sleep[4743]: /sys/class/power_supply/BAT1/current_now                    =    336 [mA]
-    sep 29 22:37:08 angela systemd-sleep[4743]: /sys/class/power_supply/BAT1/status                         = Discharging
-    sep 29 22:37:08 angela systemd-sleep[4743]: /sys/class/power_supply/BAT1/charge_control_start_threshold = (not available)
-    sep 29 22:37:08 angela systemd-sleep[4743]: /sys/class/power_supply/BAT1/charge_control_end_threshold   = (not available)
-    sep 29 22:37:08 angela systemd-sleep[5113]: Charge                                                      =   79.9 [%]
-    sep 29 22:37:08 angela systemd-sleep[5120]: Capacity                                                    =   98.5 [%]
+
+... which is 49mAh in a little over 10 minutes (and 4 seconds), much
+more than the Purism, but half of the X220. At this rate, the battery
+would last on standby *only* 72 hours, or barely 3 days.
 
 TODO: test before/after `nvme.noacpi=1`, see [this guide](https://guides.frame.work/Guide/Fedora+36+Installation+on+the+Framework+Laptop/108?lang=en#s655)
 

raw standby numbers from the framework
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 15efcfbb..d95fd4e4 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -443,9 +443,39 @@ which was fine when this battery was new (62000 mAh, so about 100
 hours, or about 5 days), but this battery is almost dead and has
 *only* 5210 mAh when full, so only 10 hours standby.
 
-And here is the Framework performing a similar test:
+And here is the Framework performing a similar test, before:
+
+    sep 29 22:27:04 angela systemd-sleep[4515]: +++ Battery Status: BAT1
+    sep 29 22:27:04 angela systemd-sleep[4515]: /sys/class/power_supply/BAT1/manufacturer                   = NVT
+    sep 29 22:27:04 angela systemd-sleep[4515]: /sys/class/power_supply/BAT1/model_name                     = Framewo
+    sep 29 22:27:04 angela systemd-sleep[4515]: /sys/class/power_supply/BAT1/cycle_count                    =      1
+    sep 29 22:27:04 angela systemd-sleep[4515]: /sys/class/power_supply/BAT1/charge_full_design             =   3572 [mAh]
+    sep 29 22:27:04 angela systemd-sleep[4515]: /sys/class/power_supply/BAT1/charge_full                    =   3518 [mAh]
+    sep 29 22:27:04 angela systemd-sleep[4515]: /sys/class/power_supply/BAT1/charge_now                     =   2861 [mAh]
+    sep 29 22:27:04 angela wpa_supplicant[1001]: wlan0: CTRL-EVENT-DSCP-POLICY clear_all
+    sep 29 22:27:04 angela wpa_supplicant[1001]: nl80211: deinit ifname=wlan0 disabled_11b_rates=0
+    sep 29 22:27:04 angela systemd-sleep[4515]: /sys/class/power_supply/BAT1/current_now                    =    633 [mA]
+    sep 29 22:27:04 angela systemd-sleep[4515]: /sys/class/power_supply/BAT1/status                         = Discharging
+    sep 29 22:27:04 angela systemd-sleep[4515]: /sys/class/power_supply/BAT1/charge_control_start_threshold = (not available)
+    sep 29 22:27:04 angela systemd-sleep[4515]: /sys/class/power_supply/BAT1/charge_control_end_threshold   = (not available)
+    sep 29 22:27:04 angela systemd-sleep[4706]: Charge                                                      =   81.3 [%]
+    sep 29 22:27:04 angela systemd-sleep[4707]: Capacity                                                    =   98.5 [%]
 
-TODO: framework suspend test
+... after:
+
+    sep 29 22:37:08 angela systemd-sleep[4743]: +++ Battery Status: BAT1
+    sep 29 22:37:08 angela systemd-sleep[4743]: /sys/class/power_supply/BAT1/manufacturer                   = NVT
+    sep 29 22:37:08 angela systemd-sleep[4743]: /sys/class/power_supply/BAT1/model_name                     = Framewo
+    sep 29 22:37:08 angela systemd-sleep[4743]: /sys/class/power_supply/BAT1/cycle_count                    =      1
+    sep 29 22:37:08 angela systemd-sleep[4743]: /sys/class/power_supply/BAT1/charge_full_design             =   3572 [mAh]
+    sep 29 22:37:08 angela systemd-sleep[4743]: /sys/class/power_supply/BAT1/charge_full                    =   3518 [mAh]
+    sep 29 22:37:08 angela systemd-sleep[4743]: /sys/class/power_supply/BAT1/charge_now                     =   2812 [mAh]
+    sep 29 22:37:08 angela systemd-sleep[4743]: /sys/class/power_supply/BAT1/current_now                    =    336 [mA]
+    sep 29 22:37:08 angela systemd-sleep[4743]: /sys/class/power_supply/BAT1/status                         = Discharging
+    sep 29 22:37:08 angela systemd-sleep[4743]: /sys/class/power_supply/BAT1/charge_control_start_threshold = (not available)
+    sep 29 22:37:08 angela systemd-sleep[4743]: /sys/class/power_supply/BAT1/charge_control_end_threshold   = (not available)
+    sep 29 22:37:08 angela systemd-sleep[5113]: Charge                                                      =   79.9 [%]
+    sep 29 22:37:08 angela systemd-sleep[5120]: Capacity                                                    =   98.5 [%]
 
 TODO: test before/after `nvme.noacpi=1`, see [this guide](https://guides.frame.work/Guide/Fedora+36+Installation+on+the+Framework+Laptop/108?lang=en#s655)
 

x220 battery test summary
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 824ddd93..15efcfbb 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -432,37 +432,16 @@ bad!
 
 In comparison, here is my really old x220, before:
 
-    sep 29 22:13:54 emma systemd-sleep[176315]: +++ ThinkPad Battery Status: BAT0 (Main / Internal)
-    sep 29 22:13:54 emma systemd-sleep[176315]: /sys/class/power_supply/BAT0/manufacturer                   = LGC
-    sep 29 22:13:54 emma systemd-sleep[176315]: /sys/class/power_supply/BAT0/model_name                     = 45N1025
-    sep 29 22:13:54 emma systemd-sleep[176315]: /sys/class/power_supply/BAT0/cycle_count                    =      0 (or not supported)
-    sep 29 22:13:54 emma systemd-sleep[176315]: /sys/class/power_supply/BAT0/energy_full_design             =  62160 [mWh]
-    sep 29 22:13:54 emma systemd-sleep[176315]: /sys/class/power_supply/BAT0/energy_full                    =   5210 [mWh]
     sep 29 22:13:54 emma systemd-sleep[176315]: /sys/class/power_supply/BAT0/energy_now                     =   5070 [mWh]
-    sep 29 22:13:54 emma systemd-sleep[176315]: /sys/class/power_supply/BAT0/power_now                      =  15832 [mW]
-    sep 29 22:13:54 emma systemd-sleep[176315]: /sys/class/power_supply/BAT0/status                         = Discharging
-    sep 29 22:13:54 emma systemd-sleep[176315]: /sys/class/power_supply/BAT0/charge_control_start_threshold =      0 [%]
-    sep 29 22:13:54 emma systemd-sleep[176315]: /sys/class/power_supply/BAT0/charge_control_end_threshold   =    100 [%]
-    sep 29 22:13:54 emma systemd-sleep[176315]: /sys/class/power_supply/BAT0/charge_behaviour               = [auto] inhibit-charge force-discharge
-    sep 29 22:13:54 emma systemd-sleep[176441]: Charge                                                      =   97.3 [%]
-    sep 29 22:13:54 emma systemd-sleep[176442]: Capacity                                                    =    8.4 [%]
 
 ... after:
 
-    sep 29 22:23:54 emma systemd-sleep[176486]: +++ ThinkPad Battery Status: BAT0 (Main / Internal)
-    sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/manufacturer                   = LGC
-    sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/model_name                     = 45N1025
-    sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/cycle_count                    =      0 (or not supported)
-    sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/energy_full_design             =  62160 [mWh]
-    sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/energy_full                    =   5210 [mWh]
     sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/energy_now                     =   4980 [mWh]
-    sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/power_now                      =  12332 [mW]
-    sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/status                         = Discharging
-    sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/charge_control_start_threshold =      0 [%]
-    sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/charge_control_end_threshold   =    100 [%]
-    sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/charge_behaviour               = [auto] inhibit-charge force-discharge
-    sep 29 22:23:54 emma systemd-sleep[176863]: Charge                                                      =   95.6 [%]
-    sep 29 22:23:54 emma systemd-sleep[176864]: Capacity                                                    =    8.4 [%]
+
+... which is 90 mwH in 10 minutes, or a whopping 540mAh per hour,
+which was fine when this battery was new (62000 mAh, so about 100
+hours, or about 5 days), but this battery is almost dead and has
+*only* 5210 mAh when full, so only 10 hours standby.
 
 And here is the Framework performing a similar test:
 

x220 before/after
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index c12b0c1b..824ddd93 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -430,9 +430,39 @@ That's 8mAh per 10 minutes (and 2 seconds), or 48mAh per hour, or,
 with this battery, about 127 hours or roughly 5 days of standby. Not
 bad!
 
-In comparison, here is my really old x220:
-
-TODO: x220 suspend test
+In comparison, here is my really old x220, before:
+
+    sep 29 22:13:54 emma systemd-sleep[176315]: +++ ThinkPad Battery Status: BAT0 (Main / Internal)
+    sep 29 22:13:54 emma systemd-sleep[176315]: /sys/class/power_supply/BAT0/manufacturer                   = LGC
+    sep 29 22:13:54 emma systemd-sleep[176315]: /sys/class/power_supply/BAT0/model_name                     = 45N1025
+    sep 29 22:13:54 emma systemd-sleep[176315]: /sys/class/power_supply/BAT0/cycle_count                    =      0 (or not supported)
+    sep 29 22:13:54 emma systemd-sleep[176315]: /sys/class/power_supply/BAT0/energy_full_design             =  62160 [mWh]
+    sep 29 22:13:54 emma systemd-sleep[176315]: /sys/class/power_supply/BAT0/energy_full                    =   5210 [mWh]
+    sep 29 22:13:54 emma systemd-sleep[176315]: /sys/class/power_supply/BAT0/energy_now                     =   5070 [mWh]
+    sep 29 22:13:54 emma systemd-sleep[176315]: /sys/class/power_supply/BAT0/power_now                      =  15832 [mW]
+    sep 29 22:13:54 emma systemd-sleep[176315]: /sys/class/power_supply/BAT0/status                         = Discharging
+    sep 29 22:13:54 emma systemd-sleep[176315]: /sys/class/power_supply/BAT0/charge_control_start_threshold =      0 [%]
+    sep 29 22:13:54 emma systemd-sleep[176315]: /sys/class/power_supply/BAT0/charge_control_end_threshold   =    100 [%]
+    sep 29 22:13:54 emma systemd-sleep[176315]: /sys/class/power_supply/BAT0/charge_behaviour               = [auto] inhibit-charge force-discharge
+    sep 29 22:13:54 emma systemd-sleep[176441]: Charge                                                      =   97.3 [%]
+    sep 29 22:13:54 emma systemd-sleep[176442]: Capacity                                                    =    8.4 [%]
+
+... after:
+
+    sep 29 22:23:54 emma systemd-sleep[176486]: +++ ThinkPad Battery Status: BAT0 (Main / Internal)
+    sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/manufacturer                   = LGC
+    sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/model_name                     = 45N1025
+    sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/cycle_count                    =      0 (or not supported)
+    sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/energy_full_design             =  62160 [mWh]
+    sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/energy_full                    =   5210 [mWh]
+    sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/energy_now                     =   4980 [mWh]
+    sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/power_now                      =  12332 [mW]
+    sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/status                         = Discharging
+    sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/charge_control_start_threshold =      0 [%]
+    sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/charge_control_end_threshold   =    100 [%]
+    sep 29 22:23:54 emma systemd-sleep[176486]: /sys/class/power_supply/BAT0/charge_behaviour               = [auto] inhibit-charge force-discharge
+    sep 29 22:23:54 emma systemd-sleep[176863]: Charge                                                      =   95.6 [%]
+    sep 29 22:23:54 emma systemd-sleep[176864]: Capacity                                                    =    8.4 [%]
 
 And here is the Framework performing a similar test:
 

working hack for backlight?
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index cac0749e..c12b0c1b 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -625,11 +625,14 @@ make this stick. I get this error message:
 
     sep 29 22:09:14 angela i3[5661]: No outputs have backlight property
 
-... which is interesting because I actually have *no* idea of what the
-heck generates this error message.
+That's because my i3 config relies on `xbacklight` to do its job, and
+that requires this blob in `/etc/X11/xorg.conf.d/backlight.conf`:
 
-In any case, I still haven't been able to figure out how to change the
-screen backlight, which is pretty bad.
+    Section "Device"
+        Identifier  "Card0"
+        Driver      "intel"
+        Option      "Backlight"  "intel_backlight"
+    EndSection
 
 Note that there's another solution flying around that fixes this by
 [changing permissions on the input device](https://community.frame.work/t/12th-gen-not-sending-xf86monbrightnessup-down/20605/24?u=anarcat) but I haven't tested

more notes
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index b90862a9..cac0749e 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -409,7 +409,38 @@ the 11th gen, according to [this report from Linux After Dark][linux-after-dark-
 which also mentions that the USB adapters take power *even when not in
 use* and quite a bit (400mW in some cases!).
 
-TODO: suspend tests, see [standby consumption](https://news.ycombinator.com/item?id=31433666)
+## Standby battery usage
+
+I wrote some [[quick hack to evaluate how much power is used during
+sleep|blog/2022-09-28-suspend-battery-use]]. Apparently, this is one
+of the areas that [should have improved since the first Framework
+model](https://news.ycombinator.com/item?id=31433666), let's see how
+it fares out.
+
+My baseline for comparison is the Purism laptop, which, in 10 minutes,
+went from this:
+
+    sep 28 11:19:45 angela systemd-sleep[209379]: /sys/class/power_supply/BAT/charge_now                      =   6045 [mAh]
+
+... to this:
+
+    sep 28 11:29:47 angela systemd-sleep[209725]: /sys/class/power_supply/BAT/charge_now                      =   6037 [mAh]
+
+That's 8mAh per 10 minutes (and 2 seconds), or 48mAh per hour, or,
+with this battery, about 127 hours or roughly 5 days of standby. Not
+bad!
+
+In comparison, here is my really old x220:
+
+TODO: x220 suspend test
+
+And here is the Framework performing a similar test:
+
+TODO: framework suspend test
+
+TODO: test before/after `nvme.noacpi=1`, see [this guide](https://guides.frame.work/Guide/Fedora+36+Installation+on+the+Framework+Laptop/108?lang=en#s655)
+
+TODO: more power management tricks in https://community.frame.work/t/linux-battery-life-tuning/6665/1
 
 ## USB-C charging
 
@@ -580,7 +611,8 @@ In the meantime, the fancy functionality can be supposedly disabled with:
 
     echo 'blacklist hid_sensor_hub' | sudo tee /etc/modprobe.d/framework-als-blacklist.conf
 
-... and a reboot. In my experience the module still loads then, I
+... and a reboot. This solution is also [documented in the upstream
+guide](https://guides.frame.work/Guide/Fedora+36+Installation+on+the+Framework+Laptop/108?lang=en#s734). In my experience however, the module still loads then, I
 actually had to block other dependencies, like this:
 
     blacklist hid_sensor_hub
@@ -638,13 +670,14 @@ It my experience it also makes things look a little fuzzier. And I
 don't find the font size to be *that* bad so I'm experimenting with
 the normal size right now.
 
-# TODO
-
-TODO: install the extra 16GB from the purism laptop into the framework
+TODO: find the equivalent of this GNOME hack (`gsettings set org.gnome.mutter experimental-features "['scale-monitor-framebuffer']"`): https://guides.frame.work/Guide/Fedora+36+Installation+on+the+Framework+Laptop/108?lang=en#s655
 
-TODO: consider throwing i3 config in puppet /etc/i3/config
+# Remaining work
 
-TODO: other manual conf: adduser anarcat sudo
+ - TODO: install the extra 16GB from the purism laptop into the framework
+ - TODO: consider throwing i3 config in puppet /etc/i3/config
+ - TODO: other manual conf: adduser anarcat sudo
+ - TODO: merge those tips in the Debian wiki page
 
 # Other resources
 

more backlight woes
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 58912de0..b90862a9 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -462,6 +462,10 @@ with something like this:
     EndSection
     EOF
 
+The keyboard backlight can be cycled with <kbd>fn-space</kbd>. The
+dimmer version is dim enough, and the keybinding is easy to find in
+the dark.
+
 ## Expansion ports
 
 I ordered a bunch of expansion ports, a total of 10. I have actually
@@ -559,7 +563,7 @@ the package installed, I get those errors in dmesg:
 those do or don't, as the WiFi seems to work well without them.
 </div>
 
-## Function keys
+## Function keys and screen backlight
 
 Out of the box, some the <kbd>fn</kbd> keys don't work. Mute, volume
 up/down, brightness, monitor changes, and the airplane mode key all do
@@ -572,11 +576,28 @@ different input device, but don't seem to work correctly. It seems
 like the solution is for the Framework team to write a driver
 specifically for this.
 
-In the meantime, the fancy functionality can be disabled with:
+In the meantime, the fancy functionality can be supposedly disabled with:
 
     echo 'blacklist hid_sensor_hub' | sudo tee /etc/modprobe.d/framework-als-blacklist.conf
 
-... and a reboot.
+... and a reboot. In my experience the module still loads then, I
+actually had to block other dependencies, like this:
+
+    blacklist hid_sensor_hub
+    blacklist hid_sensor_trigger
+    blacklist hid_sensor_iio_common
+    blacklist hid_sensor_als
+
+But then it seems I am missing something in my i3 configuration to
+make this stick. I get this error message:
+
+    sep 29 22:09:14 angela i3[5661]: No outputs have backlight property
+
+... which is interesting because I actually have *no* idea of what the
+heck generates this error message.
+
+In any case, I still haven't been able to figure out how to change the
+screen backlight, which is pretty bad.
 
 Note that there's another solution flying around that fixes this by
 [changing permissions on the input device](https://community.frame.work/t/12th-gen-not-sending-xf86monbrightnessup-down/20605/24?u=anarcat) but I haven't tested

firmware and font tricks
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index c024c818..58912de0 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -444,9 +444,23 @@ overall the experience of typing this in Emacs feels laggier than what
 it used to before. This could just be a feeling however, hard to tell
 for sure.
 
-The touchpad feels good. It seems the double-touch and palm detection
-works well enough, and I don't have to wonder too much where the
-middle button is, it just works.
+The touchpad feels good. It seems the double-finger scroll and palm
+detection works well enough, and I don't have to wonder too much where
+the middle button is, it just works.
+
+Taps don't work, out of the box: that needs to be enabled in Xorg,
+with something like this:
+
+    cat > /etc/X11/xorg.conf.d/40-libinput.conf <<EOF
+    Section "InputClass"
+          Identifier "libinput touchpad catchall"
+          MatchIsTouchpad "on"
+          MatchDevicePath "/dev/input/event*"
+          Driver "libinput"
+          Option "Tapping" "on"
+          Option "TappingButtonMap" "lmr"
+    EndSection
+    EOF
 
 ## Expansion ports
 
@@ -472,19 +486,145 @@ Still, I really like that idea that I can carry all those little
 adapters in a pouch when I travel and can basically do anything I
 want, really nice.
 
+## Proprietary firmware blobs
+
+The framework does need proprietary firmware to operate. Specifically,
+the:
+
+ * WiFi network card shipped with the DIY kit is a AX210 card that
+   requires a 5.19 kernel or later, and the [[!debpkg
+   firmware-iwlwifi]] non-free firmware package
+ * Bluetooth adapter also loads the [[!debpkg firmware-iwlwifi]]
+   package (untested)
+ * the graphics work out of the box without firmware, but certain
+   power management features come only with special proprietary
+   firmware, normally shipped in the [[!debpkg firmware-misc-nonfree]]
+   but currently missing from the package
+
+<div class="warning">
+Note that, at the time of writing, the [latest i915 firmware from
+linux-firmware](https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/tree/i915?id=51fff4e69b4554dd3fee21e3c55a0f94937293e3) does have a *serious* bug where loading *all* the
+accessible firmware results in noticeable — I estimate 200-500ms — lag
+between the keyboard (not the mouse!) and the display. Symptoms also
+include tearing and shearing of windows, it's pretty nasty.
+
+The workaround is to delete the two affected firmware files:
+
+    cd /lib/firmware && rm adlp_guc_70.1.1.bin adlp_guc_69.0.3.bin
+    update-initramfs -u
+
+You *will* get the following warning during build, which is *good* as
+it means the problematic firmware is disabled:
+
+    W: Possible missing firmware /lib/firmware/i915/adlp_guc_69.0.3.bin for module i915
+    W: Possible missing firmware /lib/firmware/i915/adlp_guc_70.1.1.bin for module i915
+
+Thanks to [EmanueleRocca](https://wiki.debian.org/EmanueleRocca) for figuring that one out. See also [this
+discussion about power management on the Framework forum](https://community.frame.work/t/12th-gen-power-management-on-linux/21330).
+</dev>
+
+<div class="note">
+Also note that the iwlwifi firmware also looks incomplete. Even with
+the package installed, I get those errors in dmesg:
+
+    [   19.534429] Intel(R) Wireless WiFi driver for Linux
+    [   19.534691] iwlwifi 0000:a6:00.0: enabling device (0000 -> 0002)
+    [   19.541867] iwlwifi 0000:a6:00.0: firmware: failed to load iwlwifi-ty-a0-gf-a0-72.ucode (-2)
+    [   19.541881] iwlwifi 0000:a6:00.0: firmware: failed to load iwlwifi-ty-a0-gf-a0-72.ucode (-2)
+    [   19.541882] iwlwifi 0000:a6:00.0: Direct firmware load for iwlwifi-ty-a0-gf-a0-72.ucode failed with error -2
+    [   19.541890] iwlwifi 0000:a6:00.0: firmware: failed to load iwlwifi-ty-a0-gf-a0-71.ucode (-2)
+    [   19.541895] iwlwifi 0000:a6:00.0: firmware: failed to load iwlwifi-ty-a0-gf-a0-71.ucode (-2)
+    [   19.541896] iwlwifi 0000:a6:00.0: Direct firmware load for iwlwifi-ty-a0-gf-a0-71.ucode failed with error -2
+    [   19.541903] iwlwifi 0000:a6:00.0: firmware: failed to load iwlwifi-ty-a0-gf-a0-70.ucode (-2)
+    [   19.541907] iwlwifi 0000:a6:00.0: firmware: failed to load iwlwifi-ty-a0-gf-a0-70.ucode (-2)
+    [   19.541908] iwlwifi 0000:a6:00.0: Direct firmware load for iwlwifi-ty-a0-gf-a0-70.ucode failed with error -2
+    [   19.541913] iwlwifi 0000:a6:00.0: firmware: failed to load iwlwifi-ty-a0-gf-a0-69.ucode (-2)
+    [   19.541916] iwlwifi 0000:a6:00.0: firmware: failed to load iwlwifi-ty-a0-gf-a0-69.ucode (-2)
+    [   19.541917] iwlwifi 0000:a6:00.0: Direct firmware load for iwlwifi-ty-a0-gf-a0-69.ucode failed with error -2
+    [   19.541922] iwlwifi 0000:a6:00.0: firmware: failed to load iwlwifi-ty-a0-gf-a0-68.ucode (-2)
+    [   19.541926] iwlwifi 0000:a6:00.0: firmware: failed to load iwlwifi-ty-a0-gf-a0-68.ucode (-2)
+    [   19.541927] iwlwifi 0000:a6:00.0: Direct firmware load for iwlwifi-ty-a0-gf-a0-68.ucode failed with error -2
+    [   19.541933] iwlwifi 0000:a6:00.0: firmware: failed to load iwlwifi-ty-a0-gf-a0-67.ucode (-2)
+    [   19.541937] iwlwifi 0000:a6:00.0: firmware: failed to load iwlwifi-ty-a0-gf-a0-67.ucode (-2)
+    [   19.541937] iwlwifi 0000:a6:00.0: Direct firmware load for iwlwifi-ty-a0-gf-a0-67.ucode failed with error -2
+    [   19.544244] iwlwifi 0000:a6:00.0: firmware: direct-loading firmware iwlwifi-ty-a0-gf-a0-66.ucode
+    [   19.544257] iwlwifi 0000:a6:00.0: api flags index 2 larger than supported by driver
+    [   19.544270] iwlwifi 0000:a6:00.0: TLV_FW_FSEQ_VERSION: FSEQ Version: 0.63.2.1
+    [   19.544523] iwlwifi 0000:a6:00.0: firmware: failed to load iwl-debug-yoyo.bin (-2)
+    [   19.544528] iwlwifi 0000:a6:00.0: firmware: failed to load iwl-debug-yoyo.bin (-2)
+    [   19.544530] iwlwifi 0000:a6:00.0: loaded firmware version 66.55c64978.0 ty-a0-gf-a0-66.ucode op_mode iwlmvm
+
+*Some* of those are available in the latest upstream firmware package
+(`iwlwifi-ty-a0-gf-a0-71.ucode`, `-68`, and `-67`). It's unclear what
+those do or don't, as the WiFi seems to work well without them.
+</div>
+
+## Function keys
+
+Out of the box, some the <kbd>fn</kbd> keys don't work. Mute, volume
+up/down, brightness, monitor changes, and the airplane mode key all do
+basically nothing. They don't send proper keysyms to Xorg at all.
+
+This is a [known problem](https://community.frame.work/t/12th-gen-not-sending-xf86monbrightnessup-down/20605) and it's related to the fact that the
+laptop has light sensors and other fancy things. Somehow some of those
+keys (e.g. the brightness controls) are supposed to show up as a
+different input device, but don't seem to work correctly. It seems
+like the solution is for the Framework team to write a driver
+specifically for this.
+
+In the meantime, the fancy functionality can be disabled with:
+
+    echo 'blacklist hid_sensor_hub' | sudo tee /etc/modprobe.d/framework-als-blacklist.conf
+
+... and a reboot.
+
+Note that there's another solution flying around that fixes this by
+[changing permissions on the input device](https://community.frame.work/t/12th-gen-not-sending-xf86monbrightnessup-down/20605/24?u=anarcat) but I haven't tested
+that or seen confirmation it works.
+
+## Resolution tweaks
+
+The Framework laptop resolution (2256px X 1504px) is big enough to
+give you a pretty small font size, so welcome to the marvelous world
+of "scaling".
+
+The [Debian wiki page](https://wiki.debian.org/InstallingDebianOn/FrameWork/12thGen) has a few tricks for this.
+
+### Console
+
+This will make the console and grub fonts more readable:
+
+    cat >> /etc/default/console-setup <<EOF
+    FONTFACE="Terminus"
+    FONTSIZE=32x16
+    EOF
+    echo GRUB_GFXMODE=1024x768 >> /etc/default/grub
+    update-grub
+
+### Xorg
+
+Adding this to your Xresources will make everything look much bigger:
+
+    Xft.dpi: 140
+    Xft.autohint: 0
+    Xft.lcdfilter: lcddefault
+    Xft.hintstyle: hintfull
+    Xft.hinting: 1
+    Xft.antialias: 1
+    Xft.rgba: rgb
+
+It my experience it also makes things look a little fuzzier. And I
+don't find the font size to be *that* bad so I'm experimenting with
+the normal size right now.
+
 # TODO
 
 TODO: install the extra 16GB from the purism laptop into the framework
 
-TODO consider throwing i3 config in puppet /etc/i3/config
+TODO: consider throwing i3 config in puppet /etc/i3/config
 
 TODO: other manual conf: adduser anarcat sudo
 
-TODO: document the firmware hacks from the debian wiki, i915,
-console-setup, xrdb
-
-TODO: i915 firmware upgrade seem to have introduce awful lag.
-
 # Other resources
 
  * [list of compatible USB-C docks](https://community.frame.work/t/usb-c-thunderbolt-dock-megathread/1460) but beware of the above

of course i got it backwards
diff --git a/blog/2022-09-29-optimizing-puppet-bootstrap.md b/blog/2022-09-29-optimizing-puppet-bootstrap.md
index 13caff1d..78f556dc 100644
--- a/blog/2022-09-29-optimizing-puppet-bootstrap.md
+++ b/blog/2022-09-29-optimizing-puppet-bootstrap.md
@@ -5,7 +5,7 @@ Well this is a mouthful.
 I recently worked on a neat hack called [puppet-package-check](https://gitlab.com/anarcat/scripts/blob/main/puppet-package-check). It
 is designed to warn about manually installed packages, to make sure
 "everything is in Puppet". But it turns out it can (probably?)
-dramatically increase the bootstrap time of Puppet bootstrap when it
+dramatically decrease the bootstrap time of Puppet bootstrap when it
 needs to install a large number of packages.
 
 # Detecting manual packages

more todos, tricks
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index e8bf6364..c024c818 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -477,11 +477,13 @@ want, really nice.
 TODO: install the extra 16GB from the purism laptop into the framework
 
 TODO consider throwing i3 config in puppet /etc/i3/config
-TODO predictable names
 
 TODO: other manual conf: adduser anarcat sudo
 
-TODO: chroots
+TODO: document the firmware hacks from the debian wiki, i915,
+console-setup, xrdb
+
+TODO: i915 firmware upgrade seem to have introduce awful lag.
 
 # Other resources
 
@@ -492,3 +494,6 @@ TODO: chroots
    a section on the Framework specifically
 
  * [desktop mod](https://github.com/whatthefilament/Frame-WorkStation) (from [this discussion](https://www.reddit.com/r/framework/comments/wvzw0m/has_anyone_taken_a_framework_motherboard_and_made/))
+
+ * [Debian installation report](https://wiki.debian.org/InstallingDebianOn/FrameWork/12thGen), has good tips on the firmware
+   hacks necessary

battery is not *that* bad
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 6f504d01..e8bf6364 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -389,9 +389,10 @@ deployed in LVFS, but that might very well be because there are
 ## Battery life
 
 Battery life is a tad disappointing. I was having between about 7
-hours of battery on the Purism Librem 13v4. Now it looks more like 4
-hours, which is nicer than my old Thinkpad X220 (20 minutes!) but
-really, it's not very good for a new generation laptop.
+hours of battery on the Purism Librem 13v4, and that's after a year or
+two of battery life. Now, I still have about 7 hours of battery life,
+which is nicer than my old Thinkpad X220 (20 minutes!) but really,
+it's not very good for a new generation laptop.
 
 I was hoping the 12th generation Intel chipset would improve things,
 but it seems either I'm missing something important in the stack, or
@@ -408,9 +409,6 @@ the 11th gen, according to [this report from Linux After Dark][linux-after-dark-
 which also mentions that the USB adapters take power *even when not in
 use* and quite a bit (400mW in some cases!).
 
-TODO: confirm the full charge duration, maybe the external NVMe drive
-is sucking up too much power.
-
 TODO: suspend tests, see [standby consumption](https://news.ycombinator.com/item?id=31433666)
 
 ## USB-C charging

a ton more notes, angela update
diff --git a/hardware/angela.mdwn b/hardware/angela.mdwn
index 7847f4c5..e064042f 100644
--- a/hardware/angela.mdwn
+++ b/hardware/angela.mdwn
@@ -55,10 +55,20 @@ because I cannot use this machine for its primary purpose (travel
 laptop). In the meantime, [[hardware/emma]] (ThinkPad X220) is back in
 production, amazingly.
 
-# 4th generation: Framework?
+# 4th generation: Framework
 
 I have ordered a Framework laptop, 12th generation, slated to be
 shipped in September 2022, following the hardware failure of the
-Purism.
+Purism. This involved a full reinstall because the first install was
+over a decade old — [[!debpkg installation-birthday]] pinned it at
+2010-03-29 — and that meant no support for EFI booting, which the
+Framework laptop requires.
+
+So during that migration, I moved the install from the [Samsung 970
+EVO NVMe drive](https://www.samsung.com/us/computing/memory-storage/solid-state-drives/ssd-970-evo-nvme-m-2-1tb-mz-v7e1t0bw/) to a [WD Blue SN570](https://www.westerndigital.com/en-ca/products/internal-drives/wd-blue-sn570-nvme-ssd#WDS100T3B0C) that was the backup drive
+for my workstation (curie). The Samsung drive is now the backup of the
+old angela install.
+
+See [[hardware/laptop/framework-12th-gen]] for a detailed review.
 
 [[!tag node]]
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index b49e81d5..6f504d01 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -89,6 +89,8 @@ long road trip across the continental US.
 
 # Actual build
 
+This is the build I ordered.
+
 ## base configuration
 
  * CPU: Intel® Core™ i5-1240P, 1079$
@@ -122,7 +124,8 @@ long road trip across the continental US.
 
  * 11th gen seems easily repairable (qrcodes pointing to [repair
    guides](https://guides.frame.work/c/Framework_Laptop)!), [10/10 score from ifixit.com](https://www.ifixit.com/News/51614/framework-laptop-teardown-10-10-but-is-it-perfect), which they call
-   "exceedingly rare"
+   "exceedingly rare", the 12th gen has a similar design and would
+   probably rate similarly
 
  * four modular USB-C ports which can fit HDMI, USB-C (pass-through,
    can provide power on both sides), USB-A, DisplayPort, MicroSD,
@@ -141,16 +144,13 @@ long road trip across the continental US.
 
  * [excellent documentation of the (proprietary) BIOS](https://community.frame.work/t/bios-guide/4178/1)
 
-Note: the following were written back when I was reading reviews about
-the 1th gen, and haven't been checked against the 12th gen nor its
-specs.
-
- * explicit linux support with [install guides](https://frame.work/ca/en/linux)
+ * explicitly linux support with [install guides](https://frame.work/ca/en/linux), although you'll
+   have to live with a bit of proprietary firmware
 
- * good reviews: [Ars Technica](https://arstechnica.com/gadgets/2021/07/frameworks-new-lightweight-modular-laptop-delivers-on-its-promises/), [Fedora developer](https://www.scrye.com/wordpress/nirik/2021/08/29/frame-work-laptop-the-hyperdetailed-fedora-review/), [iFixit
-   teardown](https://www.ifixit.com/News/51614/framework-laptop-teardown-10-10-but-is-it-perfect), [phoronix](https://www.phoronix.com/scan.php?page=article&item=framework-laptop&num=1), amazing keyboard and touchpad,
-   according to [Linux After Dark][linux-after-dark-framework] ; more critical review: [OpenBSD
-   developer](https://jcs.org/2021/08/06/framework)
+ * the 11th gen had good reviews: [Ars Technica](https://arstechnica.com/gadgets/2021/07/frameworks-new-lightweight-modular-laptop-delivers-on-its-promises/), [Fedora
+   developer](https://www.scrye.com/wordpress/nirik/2021/08/29/frame-work-laptop-the-hyperdetailed-fedora-review/), [iFixit teardown](https://www.ifixit.com/News/51614/framework-laptop-teardown-10-10-but-is-it-perfect), [phoronix](https://www.phoronix.com/scan.php?page=article&item=framework-laptop&num=1), amazing
+   keyboard and touchpad, according to [Linux After Dark][linux-after-dark-framework] ; more
+   critical review: [OpenBSD developer](https://jcs.org/2021/08/06/framework)
 
 # Cons
 
@@ -181,24 +181,12 @@ specs.
 
  * no space for a 2.5" drive
 
-Note: the following were written back when I was reading reviews about
-the 1th gen, and haven't been checked against the 12th gen nor its
-specs.
-
- * annoying LED around power button
+ * rather bright LED around power button
 
  * fan quiet when idle, but can be noisy when running
 
- * battery described as "mediocre" by Ars Technica (above), certainly
-   not up to the Dell XPS 13 standard, but may be better or equivalent
-   than my current (2021-09-27) laptop (Purism 13v4, currently says
-   7h). power problems confirmed by [this report from Linux After
-   Dark][linux-after-dark-framework] which also mentions that the USB adapters take power *even
-   when not in use* and quite a bit (400mW in some cases!); update:
-   apparently the [second generation laptop][] has improvements to the
-   battery life, namely associated with the "big-little" design of the
-   12th gen Intel chips but also [standby consumption](https://news.ycombinator.com/item?id=31433666) and
-   [firmware updates for various chipsets](https://news.ycombinator.com/item?id=31434021)
+ * battery described as "mediocre" by Ars Technica (above), confirmed
+   poor in my tests (see below)
 
 [linux-after-dark-framework]: https://linuxafterdark.net/linux-after-dark-episode-14/
 
@@ -213,8 +201,7 @@ specs.
 [second generation laptop]: https://community.frame.work/t/introducing-the-new-and-upgraded-framework-laptop/18646
 
  * a bit pricey for the performance, especially when compared to the
-   competition (e.g. Dell XPS, Apple M1), but might be worth waiting
-   for second generation
+   competition (e.g. Dell XPS, Apple M1)
 
 # Initial hardware setup
 
@@ -382,6 +369,8 @@ biggest problem is probably missing configuration (i.e. most of
 `/etc`) and that's something I can probably restore from backups as I
 find missing bits.
 
+Actual bits to consider: macchanger smartmontools vnstat? tellico
+
 ## LVFS support
 
 It looks like there's support for the (de-facto) standard LVFS
@@ -393,24 +382,108 @@ simple:
     fwupdmgr get-updates
     fwupdmgr update
 
-Nice.
+Nice. It also seems like the 12th gen [BIOS updates](https://knowledgebase.frame.work/en_us/framework-laptop-bios-and-driver-releases-12th-gen-intel-core-Bkx2kosqq) are *not* yet
+deployed in LVFS, but that might very well be because there are
+(currently) no pending BIOS updates anyways.
 
-# TODO
+## Battery life
+
+Battery life is a tad disappointing. I was having between about 7
+hours of battery on the Purism Librem 13v4. Now it looks more like 4
+hours, which is nicer than my old Thinkpad X220 (20 minutes!) but
+really, it's not very good for a new generation laptop.
+
+I was hoping the 12th generation Intel chipset would improve things,
+but it seems either I'm missing something important in the stack, or
+really those don't live up to the promises. It's possible the Linux
+kernel might be lagging, as the 12th gen Intel chips use a
+"big-little" design that could require scheduler changes to effect
+proper power savings. The [firmware updates for various chipsets](https://news.ycombinator.com/item?id=31434021)
+are supposed to improve things eventually, but I will believe this
+when I get there.
+
+The battery is certainly not up to, say, Dell XPS 13, Thinpad X1, and
+of course not the Apple M1. The power problems were already present in
+the 11th gen, according to [this report from Linux After Dark][linux-after-dark-framework]
+which also mentions that the USB adapters take power *even when not in
+use* and quite a bit (400mW in some cases!).
+
+TODO: confirm the full charge duration, maybe the external NVMe drive
+is sucking up too much power.
+
+TODO: suspend tests, see [standby consumption](https://news.ycombinator.com/item?id=31433666)
+
+## USB-C charging
+
+One thing that is really a game changer for me is USB-C charging. It's
+hard to overstate how convenient this is. I often have a USB-C cable
+lying around to charge my phone, and I can just grab that thing and
+pop it in my laptop. And while it will obviously not charge as fast as
+the provided charger, it will stop emptying tha battery at least.
+
+(As an example just now, I had the laptop plugged in the Samsung
+charger that came with a phone, and it was telling me it would take 6
+hours to charge the remaining 15%. With the provided charger, that
+flew down to *15 minutes*.)
 
-TODO: update [[hardware/laptop/angela]] with a pointer to this story
-TODO: inspect `/srv` from backups, see if we need to restore
-anything. probably some git-annex repositories.
+I also really like the idea that I can charge my laptop with a power
+bank or, hell, with my *phone* if push comes to shove.
 
-TODO: link to 
-https://www.westerndigital.com/en-ca/products/internal-drives/wd-blue-sn570-nvme-ssd#WDS100T3B0C
-https://www.samsung.com/us/computing/memory-storage/solid-state-drives/ssd-970-evo-nvme-m-2-1tb-mz-v7e1t0bw/
-WD blue was the curie backup, samsung is the live angela device, WD
-blue is now in the framework
+This is awesome. And it works from *any* of the expansion ports, of
+course.
+
+## Keyboard and touchpad
+
+The keyboard feels nice, for a laptop. I'm used to mechanical keyboard
+and I'm rather violent with those poor things. Yet the key travel is
+nice and it's clickety enough that I don't feel too disoriented.
+
+Working on an external keyboard feels laggy, that said. Typing this I
+actually went back and forth between the physical keyboard and my
+external USB keyboard, plugged into a dock, and I could feel a
+difference. It's really hard to tell without an end-to-end test, but
+overall the experience of typing this in Emacs feels laggier than what
+it used to before. This could just be a feeling however, hard to tell
+for sure.
+
+The touchpad feels good. It seems the double-touch and palm detection
+works well enough, and I don't have to wonder too much where the

(Diff truncated)
publish battery stats hack
diff --git a/blog/2022-09-28-suspend-battery-use.md b/blog/2022-09-28-suspend-battery-use.md
index b1957719..939fe4a5 100644
--- a/blog/2022-09-28-suspend-battery-use.md
+++ b/blog/2022-09-28-suspend-battery-use.md
@@ -122,4 +122,4 @@ Obviously, an improvement could be to actually write this to a file,
 do the math and log only that. But that's more work and I'm lazy right
 now, exercise for the reader I guess.
 
-[[!tag draft]]
+[[!tag hardware hack]]

stop depending on deprecated activate_this.py
diff --git a/services/upgrades/bullseye.mdwn b/services/upgrades/bullseye.mdwn
index 43c8e99c..bba67750 100644
--- a/services/upgrades/bullseye.mdwn
+++ b/services/upgrades/bullseye.mdwn
@@ -512,11 +512,10 @@ behavior, which depends on a python library not in Debian. I have this
 virtualenv to deploy it, but somehow it failed after the
 upgrade. Doing this fixed it:
 
-    mv .virtualenvs/i3_py/ .virtualenvs/i3_py.orig
-    python3 -m venv --system-site-packages ~/.virtualenvs/i3_py
-    cp .virtualenvs/i3_py.orig/bin/activate_this.py .virtualenvs/i3_py/bin/
-    .virtualenvs/i3_py/bin/pip3 install i3_py
-    rm -rf .virtualenvs/i3_py.orig
+    mv .virtualenvs/i3_py .virtualenvs/i3_py.bak &&
+    python3 -m venv --system-site-packages ~/.virtualenvs/i3_py &&
+    .virtualenvs/i3_py/bin/pip3 install i3_py &&
+    rm -rf .virtualenvs/i3_py.bak
 
 This is presumably because Python libraries get installed in a
 version-specific directory...

more setup notes
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 213091db..b49e81d5 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -216,32 +216,69 @@ specs.
    competition (e.g. Dell XPS, Apple M1), but might be worth waiting
    for second generation
 
-# Hardware setup
+# Initial hardware setup
 
-A breeze. The back cover is held together by five TorX screws, but
-there's a nice screwdriver/spudger that works well enough. (In fact, I
-love that thing and I think I'll carry it everywhere.) The keys
-actually hold in place so you can't even lose them.
+A breeze.
+
+## Accessing the board
+
+The internals are access through five TorX screws, but there's a nice
+screwdriver/spudger that works well enough. (In fact, I love that
+thing and I think I'll carry it everywhere.) The keys actually hold in
+place so you can't even lose them.
 
 The first setup is a bit counter-intuitive coming from the Librem
 laptop, as I expected the back cover to lift and give me access to the
-internals. But what the screws do is release the keyboard and touch
+internals. But instead the screws is release the keyboard and touch
 pad assembly, so you actually need to flip the laptop back upright and
-*lift the cover* (!) to get access to the internals.
+*lift the assembly off* (!) to get access to the internals. Kind of
+scary. I also actually unplugged a connector in lifting the assembly
+because I lifted it towards the monitor, while you actually need to
+lift it *to the right*. Thankfully, the connector didn't break, it
+just snapped off and I could plug it back in, no harm done.
+
+## First bad QR code
 
 Once there, everything is well indicated, with QR codes all over the
-place. The QR codes I tested (in the expansion card slow, the memory
-slot and CPU slots) did not actually work (see below) so I wonder how
+place supposedly leading to online instructions.
+
+Unfortunately, the QR codes I tested (in the expansion card slow, the
+memory slot and CPU slots) did not actually work so I wonder how
 useful those actually are. After all, they need to point to
 *something* and that means a URL, a running website that will answer
 those requests forever. I bet those will break sooner than later and
-in fact, as far as I can tell, they just don't work at all.
+in fact, as far as I can tell, they just don't work at all. I prefer
+the approach taken by the MNT reform here which designed (with the
+[100 rabbits folks](https://100r.co/)) an actual paper handbook.
+
+The first qrcode that's immediately visible from the back of the
+laptop, in an expansion cord slot, is a 404. It *seems* to be some
+serial number URL, but I can't actually tell because, well, the page
+is a 404. :)
+
+I was expecting that bar code to lead me to an introduction page,
+something like "how to setup your Framework laptop". Support actually
+confirmed that it should point a [quickstart guide](https://guides.frame.work/Guide/Framework\+Laptop\+DIY\+Edition\+Quick\+Start\+Guide/57), but the link
+they sent me was *also* broken. So definitely an area that could be
+improved, to say the least.
+
+(They have also "let the team know about this for feedback and help
+resolve the problem with the link" which is a support code word for
+"ha-ha!  nope! not my problem right now!" Trust me, I know, my own
+code word is "can you please make a ticket?")
 
-I prefer the approach taken by the MNT reform here which designed
-(with the [100 rabbits folks](https://100r.co/)) an actual paper handbook.
+## Seating disks and memory
+
+The "DIY" kit doesn't have that much to do once you're there. If you
+bought RAM, it's shipped next to the laptop in a little plastic case,
+and you just seat it in as normal. Then you insert your NVMe drive,
+and, if that's your fancy, you also install your own mPCI WiFi
+card. If you ordered one (which was my case), it's pre-installed.
 
 # Software setup
 
+## Secure boot and EFI
+
 This was less great. I couldn't boot off of the NVMe drive I
 transferred from the previous laptop (the
 [[Purism|hardware/purism-librem13v4]]) and the BIOS was not very
@@ -250,11 +287,11 @@ about it, without dropping me in the real BIOS. At first, I thought it
 was a problem with my NVMe drive, because it's not listed in the
 [compatible SSD drives](https://knowledgebase.frame.work/what-storage-ssd-parts-are-compatible-with-the-framework-laptop-rJOOeHU0_) from upstream.
 
-I figured out [how to enter BIOS](https://knowledgebase.frame.work/en_us/how-do-i-enter-the-bios-on-the-framework-laptop-HydmWf5Ad) (press <kbd>F2</kbd> manically),
-which showed me the NVMe drive is actually detected, it just didn't
-boot, very probably because it wasn't setup with EFI.
+But I figured out [how to enter BIOS](https://knowledgebase.frame.work/en_us/how-do-i-enter-the-bios-on-the-framework-laptop-HydmWf5Ad) (press <kbd>F2</kbd>
+manically), which showed me the NVMe drive is actually detected, it
+just didn't boot, because it was an old setup without EFI.
 
-From there, I disable secure boot, and booted a [grml image](https://grml.org/) to try
+From there, I disabled secure boot, and booted a [grml image](https://grml.org/) to try
 to recover. And by "boot" I mean, I managed to get to the grml boot
 loader which promptly failed to load its own root file system
 somehow. I still have to investigate exactly what happened there, but
@@ -274,21 +311,92 @@ around (backups FTW!) so I just swapped that in, rebooted in the
 Debian installer again, and did a clean install. I wanted to switch to
 bookworm anyways, so I guess that's done too.
 
+## Storage limitations
+
 Another thing that happened during setup is that I tried to copy over
 the internal 2.5" SSD drive to the 1TB expansion card I bought from
 Framework, because there's no 2.5" slot in the framework laptop of
-course. I was tired and did something stupid and ended up wiping the
-partition table on the 2.5" drive. It *might* be recoverable, but just
-restoring it didn't work either, so I'm not sure how I recover the
-data there. Normally, everything on my laptops and workstations is
-designed to be disposable, but I'd certainly like to have some closure
-on that as well.
-
-Right now I'm copying the `/home` directory over. I'll probably
-bootstrap the system from Puppet by hand.
-
-TODO: compare package lists between backup and installed from Puppet
-TODO: restore SSH keys and Puppet certs from backups
+course.
+
+I was tired and did something stupid and ended up wiping the partition
+table on the 2.5" drive. It *might* be recoverable, but just restoring
+it didn't work either, so I'm not sure how I recover the data
+there. Normally, everything on my laptops and workstations is designed
+to be disposable, but I'd certainly like to have some closure on that
+as well.
+
+## WiFi compatibility issues
+
+I couldn't make WiFi work at first. Obviously, the default Debian
+installer doesn't ship with proprietary firmware (although that [might
+change soon](https://lwn.net/Articles/908825/)) so the WiFi card didn't work out of the box. But even
+after copying the firmware through a USB stick, I couldn't quite
+manage to find the right combination of `ip`/`iw`/`wpa-supplicant`
+(yes, after repeatedly copying a bunch *more* packages over to get
+those bootstrapped).
+
+Thankfully, I had a little USB-C dongle with a RJ-45 jack lying
+around. That *also* required a firmware blob, but at least once I had
+that copied over, things just worked and I had a network.
+
+Eventually, I managed to make WiFi work; the problem was more on the
+side of "I forgot how to configure a WPA network by hand from the
+commandline" than anything else. NetworkManager worked fine and got
+WiFi working.
+
+Note that this is with Debian bookworm, which has the 5.19 Linux
+kernel, and with the [firmware-nonfree](https://tracker.debian.org/pkg/firmware-nonfree) (`firmware-iwlwifi`,
+specifically) package.
+
+## Bootstrapping Puppet
+
+Once I had some networking, I had to install all the packages I really
+need. The time I spent setting up my workstations with Puppet has
+finally paid off. What I actually did was to restore two critical
+directories:
+
+    /etc/ssh
+    /var/lib/puppet
+
+So that I would keep the previous machine's identity. That way I could
+contact the Puppet server and install whatever was missing. I used the
+[[Puppet optimization
+trick|blog/2022-09-29-optimizing-puppet-bootstrap]] to do a batch
+install and then I had a good base setup.
+
+Of course, that only gave me packages that were in Puppet. The actual
+install on the original angela workstation had a *lot* more stuff
+installed. Around 1700 packages, actually:
+
+    listing puppet packages...
+    listing apt packages...
+    loading apt cache...
+    1868 unmanaged packages found
+    aapt abiword abiword-common abiword-plugin-grammar acpi-fakekey acpi-support acpi-support-base acpid adwaita-icon-theme aha ahcpd aircrack-ng alex alot alsa-tools alsamixergui androguard android-sdk-platform-tools ant apache2-dev apel apt-src aptitude-common ash astroid at at-spi2-core atftp athena-jot audacious-plugins audacious-plugins-data aumix-common aumix-gtk autoconf autoconf-archive autojump automake autopkgtest autopoint autotools-dev avahi-autoipd avahi-daemon avahi-utils bandit baobab batctl battery-stats bb bc bibtex2html bind9-doc binfmt-support bird-doc bison blackbird-gtk-theme blender blt bluebird-gtk-theme blueman bluetooth bluez-cups bookletimposer borgmatic brasero bridge-utils btrfs-progs buildah bumblebee-status ca-certificates ca-certificates-java cabal-install cabextract cadaver calibre-bin caribou caribou-antler cdpr cgoban cheese chrpath clementine cli-common clustershell clusterssh cmake cmake-data cmatrix cmus comerr-dev command-not-found confclerk conntrack console-data console-setup console-setup-linux cowbuilder cowdancer cpufrequtils cryptsetup cryptsetup-bin cups cups-browsed cups-client cups-common cups-core-drivers cups-daemon cups-filters cups-filters-core-drivers cups-pk-helper cups-ppdc cups-server-common cutecom cvs-fast-export cvsps cython3 darcs darksnow davfs2 db-util db5.3-util dblatex dc dconf-cli dconf-editor dconf-gsettings-backend dcraw dctrl-tools ddate debconf-doc debhelper debian-keyring debian-policy debmake debootstrap debtree decopy default-jre-headless deja-dup desktop-base devhelp devhelp-common devscripts-el dh-autoreconf dh-buildinfo dh-elpa dh-exec dh-make-perl dh-ocaml dh-sysuser di-netboot-assistant dianara dictzip diffoscope diffstat dirmngr distro-info djvulibre-bin dlocate dmeventd dnsdiag dnsutils doc-base doc-rfc docbook docbook-dsssl docbook-to-man docbook-xml docbook-xsl docutils-common docutils-doc doxygen dpkg-dev dpkg-repack drm-info dselect dummydroid duplicity dvipng dvtm dzen2 eatmydata ebtables ed edbrowse efibootmgr elpa-bug-hunter elpa-flycheck-package elpa-git-commit elpa-helm elpa-magit-popup elpa-olivetti elpa-pdf-tools elpa-with-editor empathy empathy-common enblend enfuse eog epiphany epiphany-browser epiphany-data equivs espeak-data eviacam evince evolution evolution-data-server evolution-plugins evtest exiv2 extra-xdg-menus fai-setup-storage fairymax fakeroot faketime fastjar fbless fbreader fbreader-dbgsym fcgiwrap fdupes feed2imap festival feynmf ffmpeg ffmpeg-doc ffmpegthumbnailer fig2dev figlet file-roller fio firebird3.0-common firebird3.0-common-doc firejail flac flake flashrom flent flex flim flvstreamer font-manager fontforge fontforge-common fonts-cantarell fonts-croscore fonts-dkg-handwriting fonts-freefont-ttf fonts-hack fonts-hermit fonts-humor-sans fonts-linuxlibertine fonts-lyx fonts-monoid fonts-noto-cjk fonts-noto-mono fonts-noto-unhinted fonts-sil-gentiumplus fonts-sil-gentiumplus-compact fonts-stix fonts-symbola foomatic-db foomatic-db-engine fortune-mod fortunes-min fpart fracplanet freeglut3 freeipmi-tools freepats freeplane ftp fwupd fzf g++ gamin gcc-arm-linux-gnueabihf gdbserver gdebi gdebi-core gdm3 gedit gedit-plugins genisoimage geographiclib-tools getmail6 gettext gettext-base ghostscript giblib1 gimp-data gir1.2-goocanvas-2.0 gir1.2-gtk-2.0 gir1.2-gtkspell3-3.0 gir1.2-libosinfo-1.0 gir1.2-nm-1.0 gir1.2-nma-1.0 gir1.2-spiceclientgtk-3.0 git-big-picture git-cvs git-doc git-gui git-man gitbatch gitg gitk gitlab-cli gitpkg gitso gkbd-capplet glib-networking global gmpc-data gnokii-cli gnome-backgrounds gnome-bluetooth gnome-books gnome-boxes gnome-calculator gnome-calendar gnome-characters gnome-clocks gnome-color-manager gnome-common gnome-contacts gnome-control-center gnome-dictionary gnome-disk-utility gnome-documents gnome-font-viewer gnome-games gnome-getting-started-docs gnome-keyring gnome-logs gnome-maps gnome-menus gnome-mime-data gnome-music gnome-nettool gnome-online-accounts gnome-online-miners gnome-packagekit gnome-packagekit-data gnome-photos gnome-screenshot gnome-session gnome-settings-daemon gnome-shell gnome-shell-extensions gnome-sound-recorder gnome-sushi gnome-system-log gnome-system-monitor gnome-terminal gnome-themes-extra gnome-todo gnome-tweaks gnome-user-docs gnome-user-share gnome-video-arcade gnome-weather gnucash-common gnucash-docs gnuchess gnuchess-book gnulib gnumeric gnumeric-common gnupg2 gnuplot gnuplot-qt golang-github-containers-common golang-golang-x-tools googletest gopher gperf gphoto2 gpodder gpsbabel-doc gpsd gpsman gpxinfo gr-air-modes gr-hpsdr gr-iio gradle graphicsmagick greybird-gtk-theme grig grml-debootstrap grml2usb groff grub-common grub-imageboot grub-pc-bin grub2-common gsettings-desktop-schemas gsfonts gstreamer1.0-libav gstreamer1.0-nice gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-pulseaudio gthumb gtk-doc-tools gtk2-engines gtkguitune gtklp gvfs-backends gvfs-bin gyp happy haskell-devscripts haveged hddtemp hexchat highlight highlight-common horst hostapd hplip hplip-data htdig html2text htmldoc htmldoc-common httping hugin hugin-data hugin-tools hugo hwdata i3lock i3status ibus ibus-gtk3 ibus-pinyin icecast2 icedtea-netx ices2 icoutils ii imagemagick img2pdf impressive infinoted initscripts input-utils insserv installation-birthday internetarchive intltool intltool-debian iodine iperf iptraf-ng iputils-tracepath ipxe-qemu isc-dhcp-server iucode-tool jackd jackd2 jarwrapper java-common jupyter-notebook keepassx kgb-client kodi kodi-data krb5-multidev lacheck laptop-detect latexmk ldmtool leap-archive-keyring lektor lftp libacl1-dev libaio1 libalgorithm-c3-perl libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl libantlr4-runtime-java libany-moose-perl libao-dev libapp-nopaste-perl libappconfig-perl libapt-pkg-perl libarchive-zip-perl libart-2.0-2 libasm-java libasound2-dev libass-dev libatk-adaptor libatk-bridge2.0-dev libatk1.0-dev libatk1.0-doc libatspi2.0-dev libaudclient2 libaudio-mpd-common-perl libaudio-mpd-perl libaudiofile1 libauthen-dechpwd-perl libauthen-passphrase-perl libautobox-perl libavcodec-dev libavfilter-dev libavformat-dev libb-hooks-endofscope-perl libbison-dev libbit-vector-perl libbluetooth-dev libbluray-dev libboolean-perl libboost-dev libboost-thread-dev libbz2-1.0-dbgsym libc-ares2 libc6-dbg libcache-lru-perl libcairo-script-interpreter2 libcairo2-dev libcamlp4-ocaml-dev libcamomile-ocaml-data libcap-dev libcapture-tiny-perl libcaribou-gtk-module libcaribou-gtk3-module libcarp-assert-more-perl libcarp-assert-perl libcarp-clan-perl libcddb2 libcdio-dev libcec-dev libcgi-formbuilder-perl libcgi-session-perl libcglib-java libchm-bin libchm1 libclass-accessor-chained-perl libclass-accessor-lvalue-perl libclass-accessor-perl libclass-c3-perl libclass-c3-xs-perl libclass-data-inheritable-perl libclass-factory-util-perl libclass-inspector-perl libclass-isa-perl libclass-load-perl libclass-load-xs-perl libclass-method-modifiers-perl libclass-methodmaker-perl libclass-mix-perl libclass-singleton-perl libcln6 libclone-perl libclutter-imcontext-0.1-0 libclutter-imcontext-0.1-bin libcolord-dev libcommons-collections4-java libcommons-net-java libcompress-raw-zlib-perl libconfig-any-perl libconfig-file-perl libconfig-general-perl libconfig-gitlike-perl libconfig-grammar-perl libconfuse-common libconvert-asn1-perl libconvert-binhex-perl libcookie-baker-perl libcpufreq0 libcrossguid-dev libcrypt-des-perl libcrypt-dh-gmp-perl libcrypt-eksblowfish-perl libcrypt-mysql-perl libcrypt-openssl-bignum-perl libcrypt-openssl-rsa-perl libcrypt-passwdmd5-perl libcrypt-rijndael-perl libcrypt-ssleay-perl libcrypt-unixcrypt-xs-perl libcunit1-dev libcurl4-gnutls-dev libcurses-perl libcurses-ui-perl libcwiid-dev libcwiid1 libdata-entropy-perl libdata-float-perl libdata-integer-perl libdata-optlist-perl libdata-page-perl libdata-random-perl libdata-record-perl libdate-calc-perl libdate-calc-xs-perl libdate-manip-perl libdatetime-format-builder-perl libdatetime-format-iso8601-perl libdatetime-format-natural-perl libdatetime-format-strptime-perl libdatetime-locale-perl libdatetime-perl libdatetime-timezone-perl libdbd-mysql-perl libdbd-sqlite3-perl libdbi-perl libdbi1 libdbus-java libdee-1.0-4 libdevel-globaldestruction-perl libdevel-hide-perl libdevel-overloadinfo-perl libdevel-partialdump-perl libdevel-stacktrace-perl libdevmapper-event1.02.1 libdigest-crc-perl libdigest-hmac-perl libdigest-md4-perl libdiscid0 libdist-checkconflicts-perl libdistro-info-perl libdoxia-core-java libdrm-dev libdvdnav-dev libdvdread-dev libeatmydata1 libegl1-mesa-dev libemail-address-perl libemail-date-format-perl libemail-messageid-perl libemail-mime-contenttype-perl libemail-mime-encodings-perl libemail-mime-perl libemail-simple-perl libemail-valid-perl libenca-dev libenca0 libepoxy-dev liberror-perl libev-dev libeval-closure-perl libexception-class-perl libexiv2-dev libexporter-lite-perl libexporter-tiny-perl libextutils-depends-perl libextutils-pkgconfig-perl libfaketime libfcgi-perl libfcgi0ldbl libfdt1 libfelix-osgi-obr-java libfftw3-bin libfftw3-dev libfftw3-long3 libfftw3-quad3 libfftw3-single3 libfile-basedir-perl libfile-chdir-perl libfile-configdir-perl libfile-copy-recursive-perl libfile-find-rule-perl libfile-homedir-perl libfile-libmagic-perl libfile-mmagic-perl libfile-remove-perl libfile-sharedir-perl libfile-touch-perl libfile-which-perl libfinance-quote-perl libfindbugs-java libfindlib-ocaml libfindlib-ocaml-dev libflac-dev libfltk-images1.3 libfltk1.1 libfltk1.3 libfolks-telepathy25 libfont-freetype-perl libfontbox-java libfontembed1 libfreezethaw-perl libfribidi-dev libfs6 libfstrcmp-dev libfstrcmp0 libftgl-dev libfuse-dev libgadu3 libgamin0 libgcrypt20-dev libgd-perl libgdiplus libgdk-pixbuf2.0-dev libgdome2-0 libgee-0.8-dev libgetopt-argvfile-perl libgetopt-euclid-perl libgetopt-long-descriptive-perl libgettextpo0 libghc-pandoc-dev libgif-dev libgimp2.0 libgit-wrapper-perl libgit2-dev libgl1-mesa-dev libgl1-mesa-glx libgl1:i386 libglade2-0 libglade2-dev libgladeui-common libglew-dev libglib2.0-bin libglib2.0-cil libglib2.0-dev libglib2.0-doc libglu1-mesa libglu1-mesa-dev libgnomecanvas2-common libgnupg-interface-perl libgnutls-openssl27 libgnutls28-dev libgoocanvas-2.0-9 libgoocanvas-2.0-common libgovirt-common libgovirt2 libgpars-groovy-java libgpg-error-dev libgraphicsmagick-q16-3 libgraphite2-dev libgravatar-url-perl libgringotts2 libgsf-bin libgssrpc4 libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev libgtk-3-dev libgtk-3-doc libgtk2.0-cil libgtk2.0-dev libgtkspell0 libgts-0.7-5 libgts-bin libguestfs-tools libguice-java libhamlib-doc libhamlib-utils libharfbuzz-dev libharfbuzz-gobject0 libhighlight-perl libhpmud0 libhsqldb1.8.0-java libhtml-lint-perl libhtml-scrubber-perl libhtml-tableextract-perl libhtml-template-perl libhttp-headers-fast-perl libhttp-lite-perl libhttp-parser-dev libhttp-server-simple-perl libhugs-network-bundled libibus-1.0-dev libibverbs1 libidn11-dev libimage-exiftool-perl libimage-magick-perl libimage-magick-q16-perl libimobiledevice-utils libimport-into-perl libintl-perl libio-pty-perl libio-string-perl libio-stringy-perl libipc-run-perl libipc-run3-perl libipc-shareable-perl libipc-signal-perl libipc-system-simple-perl libiso9660-dev libiw30 libjaxp1.3-java libjcsp-java libjctools-java libjetty9-extra-java libjetty9-java libjformatstring-java libjline2-java libjna-platform-java libjnr-constants-java libjnr-ffi-java libjpeg-dev libjq1 libjs-angularjs libjs-inherits libjs-jquery-throttle-debounce libjs-lodash libjs-openlayers libjs-prototype libjs-scriptaculous libjson-any-perl libjson-glib-dev libjson-perl libjsr166y-java libkeybinder-3.0-0 libkrb5-dev libkxml2-java liblcms2-dev liblcms2-utils libldap2-dev libldm-1.0-0 liblensfun-data-v1 liblensfun-dev liblensfun1 liblinear-tools liblist-allutils-perl liblist-compare-perl liblist-moreutils-perl liblist-someutils-perl liblist-utilsby-perl liblog-dispatch-perl liblog-log4perl-perl libloudmouth1-0 liblouisutdml-bin liblouisutdml-data liblqr-1-0 libltdl-dev liblua5.1-0 liblua5.2-dev libluajit-5.1-dev liblwpx-paranoidagent-perl liblz4-dev liblzo2-dev libm17n-0 libmad0 libmad0-dev libmail-box-perl libmail-sendmail-perl libmarkdown2 libmath-bigint-perl libmath-round-perl libmaven3-core-java libmbedtls-dev libmcrypt4 libmd0 libmeanwhile1 libmicrohttpd-dev libmime-base64-urlsafe-perl libmime-charset-perl libmime-tools-perl libmime-types-perl libmission-control-plugins0 libmng1 libmodplug-dev libmodule-implementation-perl libmodule-pluggable-perl libmodule-runtime-conflicts-perl libmodule-runtime-perl libmono-addins-gui0.2-cil libmono-addins0.2-cil libmono-cairo4.0-cil libmono-data-tds4.0-cil libmono-i18n-west4.0-cil libmono-i18n4.0-cil libmono-posix4.0-cil libmono-security4.0-cil libmono-sharpzip4.84-cil libmono-simd4.0-cil libmono-sqlite4.0-cil libmono-system-configuration4.0-cil libmono-system-core4.0-cil libmono-system-data4.0-cil libmono-system-drawing4.0-cil libmono-system-enterpriseservices4.0-cil libmono-system-numerics4.0-cil libmono-system-security4.0-cil libmono-system-transactions4.0-cil libmono-system-web-applicationservices4.0-cil libmono-system-web-services4.0-cil libmono-system-web4.0-cil libmono-system-xml4.0-cil libmono-system4.0-cil libmoo-perl libmoose-autobox-perl libmoose-perl libmoosex-has-sugar-perl libmoosex-semiaffordanceaccessor-perl libmoosex-types-perl libmoox-configfromfile-perl libmoox-file-configdir-perl libmoox-late-perl libmoox-options-perl libmouse-perl libmousex-getopt-perl libmousex-types-path-class-perl libmousex-types-perl libmp3-info-perl libmp3-tag-perl libmp3lame-dev libmpd1 libmpdclient2 libmpeg2-4-dev libmro-compat-perl libmultiverse-core-java libnamespace-autoclean-perl libnamespace-clean-perl libncurses5 libnet-bonjour-perl libnet-daemon-perl libnet-dbus-glib-perl libnet-dns-perl libnet-domain-tld-perl libnet-dropbox-api-perl libnet-github-perl libnet-inet6glue-perl libnet-ip-perl libnet-ldap-perl libnet-oauth-perl libnet-openid-common-perl libnet-openid-consumer-perl libnet-rendezvous-publish-backend-avahi-perl libnet-rendezvous-publish-perl libnet-telnet-perl libnetpbm10 libnfs-dev libnginx-mod-http-auth-pam libnginx-mod-http-dav-ext libnginx-mod-http-echo libnginx-mod-http-geoip libnginx-mod-http-image-filter libnginx-mod-http-subs-filter libnginx-mod-http-upstream-fair libnginx-mod-http-xslt-filter libnginx-mod-mail libnginx-mod-stream libnih-dbus1 libnih1 libnl-3-dev libnl-genl-3-dev libnl-route-3-dev libnm0 libnotify-dev libnotmuch-dev libnova-0.16-0 libnumber-compare-perl libobject-realize-later-perl libodbc1 libogg-dev libogg-vorbis-header-pureperl-perl libopenexr-dev libopus-dev libosgi-annotation-java libosip2-dev libosp5 libossp-uuid-perl libossp-uuid16 libotf0 libotr5 libotr5-bin libotr5-dev libots0 libout123-0 libp11-kit-dev libp8-platform-dev libpackage-deprecationmanager-perl libpackage-stash-perl libpackage-stash-xs-perl libpam-gnome-keyring libpam0g-dev libpango-perl libpango1.0-dev libpango1.0-doc libpano13-bin libparams-classify-perl libparams-util-perl libparams-validate-perl libparams-validationcompiler-perl libparse-debcontrol-perl libpasswdqc0 libpath-class-perl libpath-tiny-perl libpathplan4 libpcap0.8-dev libpci-dev libpcre16-3 libpcre3-dev libpcre32-3 libperl6-junction-perl libpixman-1-dev libplexus-component-annotations-java libplexus-component-metadata-java libplexus-container-default1.5-java libplist-dev libplot2c2 libportaudio2 libportmidi0 libpostproc-dev libproc-daemon-perl libproc-invokeeditor-perl libproc-processtable-perl libproc-simple-perl libproc-waitstat-perl libpstoedit0c2a libptexenc1 libpurple-bin libpurple0 libpython2.7-dev libqalculate-doc libqdox2-java librcc0 librcd0 libreadonly-perl librecode0 libregexp-assemble-perl libregexp-common-perl libreoffice-calc libreoffice-gnome libreoffice-impress libreoffice-java-common libreoffice-writer libresid-builder0c2a librole-tiny-perl librpc-xml-perl librrd8 librrds-perl librsvg2-bin librsvg2-dev librtmp-dev libsamplerate0-dev libsane-hpaio libscalar-string-perl libscope-guard-perl libsdl-image1.2 libsdl-mixer1.2 libsdl-ttf2.0-0 libsdl1.2-dev libsdl2-dev libsdl2-image-2.0-0 libsdl2-image-dev libsdl2-mixer-2.0-0 libsdl2-mixer-dev libserf-1-1 libset-scalar-perl libshairport-dev libsidplay2 libsidplay2-dev libsidutils0 libsimple-http-java libsisu-inject-java libsisu-plexus-java libsmbclient-dev libsmi2ldbl libsndio-dev libsoap-lite-perl libsodium-dev libsofia-sip-ua-glib3 libsofia-sip-ua0 libsort-naturally-perl libsort-versions-perl libsoup2.4-dev libsource-highlight-common libsox-fmt-alsa libsox-fmt-base libspandsp-dev libspecio-perl libspeex-dev libspeexdsp-dev libspice-server1 libspring-beans-java libspring-core-java libsqlite3-dev libssh2-1-dev libssl-doc libstrictures-perl libstring-bufferstack-perl libstring-formatter-perl libstring-shellquote-perl libstrongswan-standard-plugins libsub-exporter-formethods-perl libsub-exporter-perl libsub-exporter-progressive-perl libsub-identify-perl libsub-install-perl libsub-name-perl libsub-uplevel-perl libsvm-tools libsvn-dev libsvn-perl libsvn1 libswitch-perl libswresample-dev libswscale-dev libsys-hostname-long-perl libsysfs2 libtag1-dev libtaglibs-standard-impl-java libtaglibs-standard-spec-java libtalloc-dev libtask-weaken-perl libtbb2 libtelepathy-farstream3 libtelepathy-glib0 libtelepathy-logger3 libtemplate-declare-perl libtemplate-perl libterm-readline-gnu-perl libterm-readline-perl-perl libterm-shell-perl libterm-size-any-perl libterm-size-perl libterm-size-perl-perl libtest-exception-perl libtest-fatal-perl libtest-http-server-simple-perl libtest-longstring-perl libtest-script-run-perl libtest-www-mechanize-perl libtexluajit2 libtext-autoformat-perl libtext-csv-perl libtext-csv-xs-perl libtext-glob-perl libtext-markdown-discount-perl libtext-markdown-perl libtext-reform-perl libtext-template-perl libtext-wikicreole-perl libtheora-dev libtie-cache-perl libtiff5-dev libtime-duration-parse-perl libtime-duration-perl libtime-progress-perl libtinfo5 libtinyxml-dev libtokyocabinet9 libtool libtype-tiny-perl libtypes-path-tiny-perl libunicode-linebreak-perl libunicode-string-perl libuniconf4.6 libupnp-dev libusb-0.1-4 libuser-identity-perl libuuid-perl libuuid-tiny-perl libuv1 libuv1-dev libv4l-dev libva-dev libvariable-magic-perl libvcdinfo0 libvde0 libvdeplug2 libvdpau-dev libvirt-clients libvirt-doc libvirtodbc0 libvisual-0.4-plugins libvlc-bin libvlc5 libvorbis-dev libvpx-dev libvte-common libvte-dev libvte9 libvulkan1 libvulkan1:i386 libwant-perl libwayland-bin libwayland-dev libwildmidi-config libwireshark-data libwmf-bin libwmf0.2-7 libwv-1.2-4 libwvstreams4.6-base libwvstreams4.6-extras libwww-mechanize-gzip-perl libwww-mechanize-perl libx11-doc libx11-protocol-other-perl libx11-xcb-dev libx86-1 libxalan2-java libxapian-dev libxcb-dri2-0-dev libxcb-dri3-dev libxcb-glx0-dev libxcb-present-dev libxcb-randr0-dev libxcb-render0-dev libxcb-shape0-dev libxcb-shm0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdelta2 libxenstore3.0 libxerces2-java libxfixes-dev libxi-dev libxine2 libxine2-bin libxine2-ffmpeg libxine2-misc-plugins libxine2-plugins libxine2-x libxkbcommon-dev libxkbfile-dev libxml-atom-simplefeed-perl libxml-commons-external-java libxml-commons-resolver1.1-java libxml-feedpp-perl libxml-namespacesupport-perl libxml-sax-base-perl libxml-sax-expat-perl libxml-sax-perl libxml-simple-perl libxml-treepp-perl libxml-writer-perl libxml2-utils libxmlsec1-dev libxmu-dev libxmu-headers libxshmfence-dev libxtst-dev libxv-dev libxxf86vm-dev libyajl-dev libyaml-libyaml-perl libyaml-perl libyaml-syck-perl libyaml-tiny-perl libzephyr4 libzip4 libzlcore-data libzltext-data link-grammar-dictionaries-en linphone-common linssid lintian linux-image-5.18.0-0.bpo.1-amd64 linux-image-amd64 liquidsoap live-build lm-sensors lmodern lnav lockfile-progs luminance-hdr lvm2 lxrandr lynx lzma m17n-db m4 macchanger maelstrom magic-wormhole maildrop mailscripts make makedev makepasswd mame man2html mandoc marble mate-desktop-environment mbr mc mc-data meld memtest86 mercurial-common mesa-common-dev mesa-utils metar mime-construct minicom miscfiles mkdocs mktorrent moc moc-ffmpeg-plugin module-assistant mono-4.0-gac mono-gac mono-runtime mousepad mp3info mpg123 mpv mscompress msr-tools mswatch mtools mupdf musescore3 nautilus nautilus-extension-brasero nautilus-sendto ncftp nd ndisc6 nec2c neomutt net-tools nethack-common nethack-console netpbm network-manager-dev network-manager-openvpn network-manager-vpnc network-manager-vpnc-gnome nginx nginx-common nginx-doc nginx-full nmon node-amdefine node-balanced-match node-brace-expansion node-builtin-modules node-concat-map node-fs.realpath node-hosted-git-info node-inflight node-is-builtin-module node-isexe node-path-is-absolute node-pseudomap node-source-map node-spdx-correct node-spdx-expression-parse node-spdx-license-ids node-validate-npm-package-license node-wrappy node-yallist notmuch-mutt ntpdate nvme-cli nwipe obs-studio ocaml-base-nox ocaml-findlib ocaml-interp ocrfeeder odbcinst odbcinst1debian2 offlineimap3 okular okular-extra-backends openbsd-inetd opensc-pkcs11 openstack-pkg-tools os-prober osmo oss-compat owx oxygen-icon-theme oz paprefs patch patchutils pbuilder pbzip2 pcmanfm pcmciautils pdf-presenter-console pelican pepper perl-tk perlmagick pflogsumm php-cli php-common php-console-table php-pear php-xml physlock pi picocom pidgin-data pidgin-guifications pidgin-otr pius plymouth-themes pm-utils po-debconf poc-streamer poppler-utils postgresql-client-common powermgmt-base pppoe pppoeconf pqiv preview-latex-style printer-driver-all printer-driver-c2050 printer-driver-c2esp printer-driver-cjet printer-driver-escpr printer-driver-foo2zjs printer-driver-foo2zjs-common printer-driver-fujixerox printer-driver-gutenprint printer-driver-hpcups printer-driver-hpijs printer-driver-m2300w printer-driver-min12xxw printer-driver-pnm2ppa printer-driver-postscript-hp printer-driver-ptouch printer-driver-pxljr printer-driver-sag-gdi printer-driver-splix pristine-tar progress prometheus-node-exporter protobuf-compiler ps2eps pssh pstoedit psutils pulseaudio pulseaudio-module-bluetooth pumpa purifyeps pxlib1 pycodestyle pyflakes3 pypy python-dbus-dev python-flask-doc python-gi-dev python-jinja2 python-jinja2-doc python-markupsafe python-matplotlib-data python-nose2-doc python-tk python2.7-doc python3-acoustid python3-all python3-attr python3-blinker python3-bs4 python3-build python3-cachecontrol python3-cffi python3-cffi-backend python3-characteristic python3-click python3-clustershell python3-colorlog python3-colour python3-constantly python3-cryptography python3-cycler python3-dateparser python3-dev python3-distutils-extra python3-docopt python3-docutils python3-elasticsearch python3-examples python3-feedparser python3-flake8 python3-future python3-geoip python3-git python3-gitdb python3-gitlab python3-gphoto2 python3-hkdf python3-humanfriendly python3-humanize python3-i3ipc python3-importlib-metadata python3-incremental python3-ipython python3-ipython-genutils python3-jinja2 python3-keyring python3-keyrings.alt python3-ldap python3-livereload python3-lockfile python3-lxml python3-markdown python3-matplotlib python3-musicpd python3-newt python3-notebook python3-notify2 python3-openssl python3-pandas python3-pbr python3-pexpect python3-pickleshare python3-pil python3-pilkit python3-ply python3-prompt-toolkit python3-ptyprocess python3-pyasn1-modules python3-pycodestyle python3-pycparser python3-pyflakes python3-pystache python3-pytest-cov python3-pytest-runner python3-pyudev python3-requests-file python3-secretstorage python3-serial python3-service-identity python3-sh python3-smmap python3-socks python3-spake2 python3-tabulate python3-termcolor python3-tqdm python3-traitlets python3-twisted python3-usb python3-venv python3-wcwidth python3-whois python3-xdo python3-zope.interface qemu-system qemu-user qemu-utils qgo qprint qqwing qrencode qtbase5-dev qthid-fcd-controller qttools5-dev-tools quvi r-cran-ggplot2 r-cran-reshape2 radeontool radvd rake rdesktop recode resolvconf restic rhythmbox rhythmbox-plugin-cdrecorder rhythmbox-plugins ristretto roffit rst2pdf rtmpdump ruby ruby-bundler ruby-cairo ruby-deep-merge ruby-dev ruby-did-you-mean ruby-faraday ruby-gettext ruby-html-proofer ruby-kramdown-rfc2629 ruby-locale ruby-minitest ruby-net-telnet ruby-nokogiri ruby-open4 ruby-pkg-config ruby-power-assert ruby-ronn ruby-rspec-puppet ruby-test-unit ruby-text-format rygel-playbin rygel-preferences rygel-tracker sacc samba-common samba-common-bin saytime sc scons scrcpy screenfetch scrot sdate seabios seahorse seahorse-daemon sendxmpp sent sgml-data sharutils shelldap shotwell signify signify-openbsd signify-openbsd-keys signing-party simple-scan simplescreenrecorder slib smartmontools smbclient sockstat sound-juicer sound-theme-freedesktop source-highlight spawn-fcgi sphinx-common sphinx-doc sqlite3 sqlite3-doc squid-deb-proxy-client ssh-askpass ssh-audit sshuttle ssl-cert startpar steam:i386 stellarium-data stress stress-ng strip-nondeterminism strongswan suckless-tools sudoku svn-buildpackage sweethome3d swig swish++ symlinks synaptic syncthing sysfsutils syslinux syslinux-common system-config-printer-common system-config-printer-udev sysuser-helper sysv-rc sysv-rc-conf tango-icon-theme tasksel taskwarrior tcl tcpd telepathy-haze telepathy-idle telepathy-logger telepathy-mission-control-5 telepathy-rakia telepathy-salut tellico tellico-data tellico-scripts telnet tesseract-ocr tex-common texlive texlive-base texlive-bibtex-extra texlive-binaries texlive-extra-utils texlive-font-utils texlive-fonts-extra texlive-fonts-recommended texlive-fonts-recommended-doc texlive-lang-french texlive-latex-base-doc texlive-latex-extra-doc texlive-latex-recommended-doc texlive-metapost texlive-metapost-doc texlive-pictures texlive-pictures-doc texlive-pstricks texlive-pstricks-doc texlive-xetex tftp-hpa tftpd thunar-archive-plugin thunar-data thunar-media-tags-plugin thunar-volman tidy tig tipa tk tla tla-doc tmate toilet-fonts tor-geoipdb torsocks totem totem-plugins traceroute tracker transgui translate-shell transmission transmission-cli transmission-gtk transmission-qt-dbgsym trustedqsl tsocks uhd-host uhubctl unicode-data units unixodbc unp unrar-free uuid v4l-utils va-driver-all vacation vagrant-cachier vagrant-libvirt vagrant-sshfs valac vbetool vbindiff vde2 vgabios viking vim-runtime vinagre vino virt-manager virtualenvwrapper virtuoso-minimal visidata vlan vlc-bin vlc-data vlc-l10n vlc-plugin-base vlc-plugin-notify vlc-plugin-video-output vlc-plugin-video-splitter vlc-plugin-visualization vlock vnstat vorbis-tools vorbisgain vpnc vulkan-tools:i386 w3c-linkchecker w3m wamerican wayland-protocols wdiff weechat weechat-doc weechat-scripts wfrench whipper whohas wipe wireshark wireshark-common workrave-data wvdial wwwconfig-common x11-apps x11-session-utils x11-xfs-utils x11proto-record-dev x11proto-xf86vidmode-dev x11vnc xaos xapian-doc xapian-examples xapian-omega xapian-tools xautolock xbase-clients xbindkeys xboard xclip xdelta xdelta3 xdg-user-dirs-gtk xfburn xfce4 xfce4-appfinder xfce4-battery-plugin xfce4-clipman xfce4-clipman-plugin xfce4-cpufreq-plugin xfce4-cpugraph-plugin xfce4-datetime-plugin xfce4-dict xfce4-diskperf-plugin xfce4-fsguard-plugin xfce4-genmon-plugin xfce4-goodies xfce4-mailwatch-plugin xfce4-mount-plugin xfce4-netload-plugin xfce4-panel xfce4-places-plugin xfce4-pulseaudio-plugin xfce4-screenshooter xfce4-sensors-plugin xfce4-smartbookmark-plugin xfce4-systemload-plugin xfce4-taskmanager xfce4-timer-plugin xfce4-verve-plugin xfce4-wavelan-plugin xfce4-weather-plugin xfce4-xkb-plugin xfonts-100dpi xfonts-75dpi xfonts-scalable xgnokii xine-ui xininfo xinit xli xloadimage xml-core xml2rfc xmlto xmms2-plugin-daap xnec2c xorg xorg-docs xorg-docs-core xpdf xplanet-images xpra xsane-common xscreensaver-data xscreensaver-data-extra xsltproc xtrace xtrlock xvfb xxd yasm yelp yubioath-desktop zathura zeitgeist-core zenity zip zonemaster-cli zsh
+    popcon stats not available: [Errno 2] No such file or directory: '/var/log/popularity-contest'
+
+OMFG. 1868 packages. Life is too short to get through all of
+this. YOLO, and I guess I'll live with the repeated "aargh why isn't
+this installed" problem and just deal with this as I go along. The
+biggest problem is probably missing configuration (i.e. most of
+`/etc`) and that's something I can probably restore from backups as I
+find missing bits.
+
+## LVFS support
+
+It looks like there's support for the (de-facto) standard LVFS
+firmware update system. At least I was able to update the UEFI with a
+simple:
+
+    apt install fwupd-amd64-signed
+    fwupdmgr refresh
+    fwupdmgr get-updates
+    fwupdmgr update
+

(Diff truncated)
creating tag page tag/puppet
diff --git a/tag/puppet.mdwn b/tag/puppet.mdwn
new file mode 100644
index 00000000..aebd0b4d
--- /dev/null
+++ b/tag/puppet.mdwn
@@ -0,0 +1,4 @@
+[[!meta title="pages tagged puppet"]]
+
+[[!inline pages="tagged(puppet)" actions="no" archive="yes"
+feedshow=10]]

slight edit, publish
diff --git a/blog/2022-09-29-optimizing-puppet-bootstrap.md b/blog/2022-09-29-optimizing-puppet-bootstrap.md
index c1e236c0..13caff1d 100644
--- a/blog/2022-09-29-optimizing-puppet-bootstrap.md
+++ b/blog/2022-09-29-optimizing-puppet-bootstrap.md
@@ -4,9 +4,9 @@ Well this is a mouthful.
 
 I recently worked on a neat hack called [puppet-package-check](https://gitlab.com/anarcat/scripts/blob/main/puppet-package-check). It
 is designed to warn about manually installed packages, to make sure
-"everything is in Puppet". But it turns out it can dramatically
-increase the bootstrap time of Puppet bootstrap when it needs to
-install a large number of packages.
+"everything is in Puppet". But it turns out it can (probably?)
+dramatically increase the bootstrap time of Puppet bootstrap when it
+needs to install a large number of packages.
 
 # Detecting manual packages
 
@@ -93,15 +93,16 @@ and live without X(org).
 # Optimizing large package installs
 
 But that, of course, is not all. Why make things simple when you can
-have an unreadable title that's is both trying to be syntactically
-correct *and* click-baity enough to flatter my vain ego?
+have an unreadable title that is trying to be both syntactically
+correct *and* click-baity enough to flatter my vain ego? Right.
 
 One of the challenges in bootstrapping Puppet with large package lists
 is that it's *slow*. Puppet lists packages as individual resources and
 will basically run `apt install $PKG` on *every* package in the
 manifest, one at a time. While the overhead of `apt` is generally
 small, when you add things like `apt-listbugs`, `apt-listchanges`,
-`needrestart`, triggers and so on, this can take forever.
+`needrestart`, triggers and so on, it can take forever setting up a
+new host.
 
 So for initial installs, it can actually makes sense to skip the queue
 and just install everything in one big batch.
@@ -145,4 +146,4 @@ In any case, I have that gut feeling it's faster, so you'll have to
 just trust my gut. It is, after all, [much more important than you
 might think](https://en.wikipedia.org/wiki/Human_microbiome).
 
-[[!tag draft]]
+[[!tag debian puppet debian-planet hack]]

a neat little puppet trick
diff --git a/blog/2022-09-29-optimizing-puppet-bootstrap.md b/blog/2022-09-29-optimizing-puppet-bootstrap.md
new file mode 100644
index 00000000..c1e236c0
--- /dev/null
+++ b/blog/2022-09-29-optimizing-puppet-bootstrap.md
@@ -0,0 +1,148 @@
+[[!meta title="Detecting manual (and optimizing large) package installs in Puppet"]]
+
+Well this is a mouthful.
+
+I recently worked on a neat hack called [puppet-package-check](https://gitlab.com/anarcat/scripts/blob/main/puppet-package-check). It
+is designed to warn about manually installed packages, to make sure
+"everything is in Puppet". But it turns out it can dramatically
+increase the bootstrap time of Puppet bootstrap when it needs to
+install a large number of packages.
+
+# Detecting manual packages
+
+On a cleanly filed workstation, it looks like this:
+
+    root@emma:/home/anarcat/bin# ./puppet-package-check -v
+    listing puppet packages...
+    listing apt packages...
+    loading apt cache...
+    0 unmanaged packages found
+
+A messy workstation will look like this:
+
+    root@curie:/home/anarcat/bin# ./puppet-package-check -v
+    listing puppet packages...
+    listing apt packages...
+    loading apt cache...
+    288 unmanaged packages found
+    apparmor-utils beignet-opencl-icd bridge-utils clustershell cups-pk-helper davfs2 dconf-cli dconf-editor dconf-gsettings-backend ddccontrol ddrescueview debmake debootstrap decopy dict-devil dict-freedict-eng-fra dict-freedict-eng-spa dict-freedict-fra-eng dict-freedict-spa-eng diffoscope dnsdiag dropbear-initramfs ebtables efibootmgr elpa-lua-mode entr eog evince figlet file file-roller fio flac flex font-manager fonts-cantarell fonts-inconsolata fonts-ipafont-gothic fonts-ipafont-mincho fonts-liberation fonts-monoid fonts-monoid-tight fonts-noto fonts-powerline fonts-symbola freeipmi freetype2-demos ftp fwupd-amd64-signed gallery-dl gcc-arm-linux-gnueabihf gcolor3 gcp gdisk gdm3 gdu gedit gedit-plugins gettext-base git-debrebase gnome-boxes gnote gnupg2 golang-any golang-docker-credential-helpers golang-golang-x-tools grub-efi-amd64-signed gsettings-desktop-schemas gsfonts gstreamer1.0-libav gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-pulseaudio gtypist gvfs-backends hackrf hashcat html2text httpie httping hugo humanfriendly iamerican-huge ibus ibus-gtk3 ibus-libpinyin ibus-pinyin im-config imediff img2pdf imv initramfs-tools input-utils installation-birthday internetarchive ipmitool iptables iptraf-ng jackd2 jupyter jupyter-nbextension-jupyter-js-widgets jupyter-qtconsole k3b kbtin kdialog keditbookmarks keepassxc kexec-tools keyboard-configuration kfind konsole krb5-locales kwin-x11 leiningen lightdm lintian linux-image-amd64 linux-perf lmodern lsb-base lvm2 lynx lz4json magic-wormhole mailscripts mailutils manuskript mat2 mate-notification-daemon mate-themes mime-support mktorrent mp3splt mpdris2 msitools mtp-tools mtree-netbsd mupdf nautilus nautilus-sendto ncal nd ndisc6 neomutt net-tools nethogs nghttp2-client nocache npm2deb ntfs-3g ntpdate nvme-cli nwipe obs-studio okular-extra-backends openstack-clients openstack-pkg-tools paprefs pass-extension-audit pcmanfm pdf-presenter-console pdf2svg percol pipenv playerctl plymouth plymouth-themes popularity-contest progress prometheus-node-exporter psensor pubpaste pulseaudio python3-ldap qjackctl qpdfview qrencode r-cran-ggplot2 r-cran-reshape2 rake restic rhash rpl rpm2cpio rs ruby ruby-dev ruby-feedparser ruby-magic ruby-mocha ruby-ronn rygel-playbin rygel-tracker s-tui sanoid saytime scrcpy scrcpy-server screenfetch scrot sdate sddm seahorse shim-signed sigil smartmontools smem smplayer sng sound-juicer sound-theme-freedesktop spectre-meltdown-checker sq ssh-audit sshuttle stress-ng strongswan strongswan-swanctl syncthing system-config-printer system-config-printer-common system-config-printer-udev systemd-bootchart systemd-container tardiff task-desktop task-english task-ssh-server tasksel tellico texinfo texlive-fonts-extra texlive-lang-cyrillic texlive-lang-french texlive-lang-german texlive-lang-italian texlive-xetex tftp-hpa thunar-archive-plugin tidy tikzit tint2 tintin++ tipa tpm2-tools traceroute tree trocla ucf udisks2 unifont unrar-free upower usbguard uuid-runtime vagrant-cachier vagrant-libvirt virt-manager vmtouch vorbis-tools w3m wamerican wamerican-huge wfrench whipper whohas wireshark xapian-tools xclip xdg-user-dirs-gtk xlax xmlto xsensors xserver-xorg xsltproc xxd xz-utils yubioath-desktop zathura zathura-pdf-poppler zenity zfs-dkms zfs-initramfs zfsutils-linux zip zlib1g zlib1g-dev
+    157 old: apparmor-utils clustershell davfs2 dconf-cli dconf-editor ddccontrol ddrescueview decopy dnsdiag ebtables efibootmgr elpa-lua-mode entr figlet file-roller fio flac flex font-manager freetype2-demos ftp gallery-dl gcc-arm-linux-gnueabihf gcolor3 gcp gdu gedit git-debrebase gnote golang-docker-credential-helpers golang-golang-x-tools gtypist hackrf hashcat html2text httpie httping hugo humanfriendly iamerican-huge ibus ibus-pinyin imediff input-utils internetarchive ipmitool iptraf-ng jackd2 jupyter-qtconsole k3b kbtin kdialog keditbookmarks keepassxc kexec-tools kfind konsole leiningen lightdm lynx lz4json magic-wormhole manuskript mat2 mate-notification-daemon mktorrent mp3splt msitools mtp-tools mtree-netbsd nautilus nautilus-sendto nd ndisc6 neomutt net-tools nethogs nghttp2-client nocache ntpdate nwipe obs-studio openstack-pkg-tools paprefs pass-extension-audit pcmanfm pdf-presenter-console pdf2svg percol pipenv playerctl qjackctl qpdfview qrencode r-cran-ggplot2 r-cran-reshape2 rake restic rhash rpl rpm2cpio rs ruby-feedparser ruby-magic ruby-mocha ruby-ronn s-tui saytime scrcpy screenfetch scrot sdate seahorse shim-signed sigil smem smplayer sng sound-juicer spectre-meltdown-checker sq ssh-audit sshuttle stress-ng system-config-printer system-config-printer-common tardiff tasksel tellico texlive-lang-cyrillic texlive-lang-french tftp-hpa tikzit tint2 tintin++ tpm2-tools traceroute tree unrar-free vagrant-cachier vagrant-libvirt vmtouch vorbis-tools w3m wamerican wamerican-huge wfrench whipper whohas xdg-user-dirs-gtk xlax xmlto xsensors xxd yubioath-desktop zenity zip
+    131 new: beignet-opencl-icd bridge-utils cups-pk-helper dconf-gsettings-backend debmake debootstrap dict-devil dict-freedict-eng-fra dict-freedict-eng-spa dict-freedict-fra-eng dict-freedict-spa-eng diffoscope dropbear-initramfs eog evince file fonts-cantarell fonts-inconsolata fonts-ipafont-gothic fonts-ipafont-mincho fonts-liberation fonts-monoid fonts-monoid-tight fonts-noto fonts-powerline fonts-symbola freeipmi fwupd-amd64-signed gdisk gdm3 gedit-plugins gettext-base gnome-boxes gnupg2 golang-any grub-efi-amd64-signed gsettings-desktop-schemas gsfonts gstreamer1.0-libav gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-pulseaudio gvfs-backends ibus-gtk3 ibus-libpinyin im-config img2pdf imv initramfs-tools installation-birthday iptables jupyter jupyter-nbextension-jupyter-js-widgets keyboard-configuration krb5-locales kwin-x11 lintian linux-image-amd64 linux-perf lmodern lsb-base lvm2 mailscripts mailutils mate-themes mime-support mpdris2 mupdf ncal npm2deb ntfs-3g nvme-cli okular-extra-backends openstack-clients plymouth plymouth-themes popularity-contest progress prometheus-node-exporter psensor pubpaste pulseaudio python3-ldap ruby ruby-dev rygel-playbin rygel-tracker sanoid scrcpy-server sddm smartmontools sound-theme-freedesktop strongswan strongswan-swanctl syncthing system-config-printer-udev systemd-bootchart systemd-container task-desktop task-english task-ssh-server texinfo texlive-fonts-extra texlive-lang-german texlive-lang-italian texlive-xetex thunar-archive-plugin tidy tipa trocla ucf udisks2 unifont upower usbguard uuid-runtime virt-manager wireshark xapian-tools xclip xserver-xorg xsltproc xz-utils zathura zathura-pdf-poppler zfs-dkms zfs-initramfs zfsutils-linux zlib1g zlib1g-dev
+
+Yuck! That's a lot of shit to go through.
+
+Notice how the packages get sorted between "old" and "new"
+packages. This is because popcon is used as a tool to mark which
+packages are "old". If you have unmanaged packages, the "old" ones are
+likely things that you can uninstall, for example.
+
+If you don't have [popcon](https://popcon.debian.org/) installed, you'll also get this warning:
+
+    popcon stats not available: [Errno 2] No such file or directory: '/var/log/popularity-contest'
+
+The error can otherwise be safely ignored, but you won't get "help"
+prioritizing the packages to add to your manifests.
+
+Note that the tool ignores packages that were "marked" (see
+[apt-mark(8)](https://manpages.debian.org/apt-mark)) as automatically installed. This implies that you
+might have to do a little bit of cleanup the first time you run this,
+as Debian doesn't necessarily mark all of those packages correctly on
+first install. For example, here's how it looks like on a clean
+install, after Puppet ran:
+
+    root@angela:/home/anarcat# ./bin/puppet-package-check -v
+    listing puppet packages...
+    listing apt packages...
+    loading apt cache...
+    127 unmanaged packages found
+    ca-certificates console-setup cryptsetup-initramfs dbus file gcc-12-base gettext-base grub-common grub-efi-amd64 i3lock initramfs-tools iw keyboard-configuration krb5-locales laptop-detect libacl1 libapparmor1 libapt-pkg6.0 libargon2-1 libattr1 libaudit-common libaudit1 libblkid1 libbpf0 libbsd0 libbz2-1.0 libc6 libcap-ng0 libcap2 libcap2-bin libcom-err2 libcrypt1 libcryptsetup12 libdb5.3 libdebconfclient0 libdevmapper1.02.1 libedit2 libelf1 libext2fs2 libfdisk1 libffi8 libgcc-s1 libgcrypt20 libgmp10 libgnutls30 libgpg-error0 libgssapi-krb5-2 libhogweed6 libidn2-0 libip4tc2 libiw30 libjansson4 libjson-c5 libk5crypto3 libkeyutils1 libkmod2 libkrb5-3 libkrb5support0 liblocale-gettext-perl liblockfile-bin liblz4-1 liblzma5 libmd0 libmnl0 libmount1 libncurses6 libncursesw6 libnettle8 libnewt0.52 libnftables1 libnftnl11 libnl-3-200 libnl-genl-3-200 libnl-route-3-200 libnss-systemd libp11-kit0 libpam-systemd libpam0g libpcre2-8-0 libpcre3 libpcsclite1 libpopt0 libprocps8 libreadline8 libselinux1 libsemanage-common libsemanage2 libsepol2 libslang2 libsmartcols1 libss2 libssl1.1 libssl3 libstdc++6 libsystemd-shared libsystemd0 libtasn1-6 libtext-charwidth-perl libtext-iconv-perl libtext-wrapi18n-perl libtinfo6 libtirpc-common libtirpc3 libudev1 libunistring2 libuuid1 libxtables12 libxxhash0 libzstd1 linux-image-amd64 logsave lsb-base lvm2 media-types mlocate ncurses-term pass-extension-otp puppet python3-reportbug shim-signed tasksel ucf usr-is-merged util-linux-extra wpasupplicant xorg zlib1g
+    popcon stats not available: [Errno 2] No such file or directory: '/var/log/popularity-contest'
+
+Normally, there should be unmanaged packages here. But because of the
+way Debian is installed, a lot of libraries and some core packages are
+marked as manually installed, and are of course not managed through
+Puppet. There are two solutions to this problem:
+
+ * *really* manage everything in Puppet (argh)
+ * mark packages as automatically installed
+
+I typically chose the second path and mark a ton of stuff as
+automatic. Then either they will be auto-removed, or will stop being
+listed. In the above scenario, one could mark all libraries as
+automatically installed with:
+
+    apt-mark auto $(./bin/puppet-package-check | grep -o 'lib[^ ]*')
+
+... but if you trust that most of that stuff is actually garbage that
+you don't really want installed anyways, you could just mark it *all*
+as automatically installed:
+
+    apt-mark auto $(./bin/puppet-package-check)
+
+In my case, that ended up keeping basically all libraries (because of
+course they're installed for *some* reason) and auto-removing this:
+
+    dh-dkms discover-data dkms libdiscover2 libjsoncpp25 libssl1.1 linux-headers-amd64 mlocate pass-extension-otp pass-otp plocate x11-apps x11-session-utils xinit xorg
+
+You'll notice `xorg` in there: yep, that's bad. Not what I wanted. But
+for some reason, on other workstations, I did *not* actually have
+`xorg` installed. Turns out having `xserver-xorg` is enough, and that
+one has dependencies. So now I guess I just learned to stop worrying
+and live without X(org).
+
+# Optimizing large package installs
+
+But that, of course, is not all. Why make things simple when you can
+have an unreadable title that's is both trying to be syntactically
+correct *and* click-baity enough to flatter my vain ego?
+
+One of the challenges in bootstrapping Puppet with large package lists
+is that it's *slow*. Puppet lists packages as individual resources and
+will basically run `apt install $PKG` on *every* package in the
+manifest, one at a time. While the overhead of `apt` is generally
+small, when you add things like `apt-listbugs`, `apt-listchanges`,
+`needrestart`, triggers and so on, this can take forever.
+
+So for initial installs, it can actually makes sense to skip the queue
+and just install everything in one big batch.
+
+And because the above tool inspects the packages installed by Puppet,
+you can run it against a catalog and have a full lists of all the
+packages Puppet *would* install, even before I even had Puppet
+running. 
+
+So when reinstalling my laptop, I basically did this:
+
+    apt install puppet-agent/experimental
+    puppet agent --test --noop
+    apt install $(./puppet-package-check --debug \
+        2>&1 | grep ^puppet\ packages 
+        | sed 's/puppet packages://;s/ /\n/g'
+        | grep -v -e onionshare -e golint -e git-sizer -e github-backup -e hledger -e xsane -e audacity -e chirp -e elpa-flycheck -e elpa-lsp-ui -e yubikey-manager -e git-annex -e hopenpgp-tools -e puppet
+    ) puppet-agent/experimental
+
+That massive `grep` was because there are currently a *lot* of
+packages missing from bookworm. Those are *all* packages that I have
+in my catalog but that still haven't made it to bookworm. Sad, I
+know. I eventually worked around that by adding `bullseye` sources so
+that the Puppet manifest actually ran.
+
+The point here is that this improves the Puppet run time *a lot*. All
+packages get installed at once, and you get a nice progress bar. Then
+you actually run Puppet to deploy configurations and all the other
+goodies:
+
+    puppet agent --test
+
+I wish I could tell you how much faster that ran. I don't know, and I
+will *not* go through a full reinstall just to please your
+curiosity. The only hard number I have is that it installed 444
+packages (which exploded in 10,191 packages with dependencies) in a
+mere 10 minutes. That might also be with the packages already
+downloaded.
+
+In any case, I have that gut feeling it's faster, so you'll have to
+just trust my gut. It is, after all, [much more important than you
+might think](https://en.wikipedia.org/wiki/Human_microbiome).
+
+[[!tag draft]]

more TODOs
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index e4be54d8..213091db 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -246,14 +246,19 @@ This was less great. I couldn't boot off of the NVMe drive I
 transferred from the previous laptop (the
 [[Purism|hardware/purism-librem13v4]]) and the BIOS was not very
 helpful: it was just failing to find any boot device and complaining
-about it, without dropping me in the real BIOS. I figured out [how to
-enter BIOS](https://knowledgebase.frame.work/en_us/how-do-i-enter-the-bios-on-the-framework-laptop-HydmWf5Ad) (press <kbd>F2</kbd> manically), disable secure boot,
-and boot a [grml image](https://grml.org/).
+about it, without dropping me in the real BIOS. At first, I thought it
+was a problem with my NVMe drive, because it's not listed in the
+[compatible SSD drives](https://knowledgebase.frame.work/what-storage-ssd-parts-are-compatible-with-the-framework-laptop-rJOOeHU0_) from upstream.
 
-And by "boot" I mean, I managed to get to the grml boot loader which
-promptly failed to load its own root file system somehow. I still have
-to investigate exactly what happened there, but it failed some time
-after the initrd load with:
+I figured out [how to enter BIOS](https://knowledgebase.frame.work/en_us/how-do-i-enter-the-bios-on-the-framework-laptop-HydmWf5Ad) (press <kbd>F2</kbd> manically),
+which showed me the NVMe drive is actually detected, it just didn't
+boot, very probably because it wasn't setup with EFI.
+
+From there, I disable secure boot, and booted a [grml image](https://grml.org/) to try
+to recover. And by "boot" I mean, I managed to get to the grml boot
+loader which promptly failed to load its own root file system
+somehow. I still have to investigate exactly what happened there, but
+it failed some time after the initrd load with:
 
     Unable to find medium containing a live file system
 
@@ -295,6 +300,7 @@ WD blue was the curie backup, samsung is the live angela device, WD
 blue is now in the framework
 
 TODO: install the extra 16GB from the purism laptop into the framework
+TODO: firmware upgrades all around, e.g. [BIOS](https://knowledgebase.frame.work/en_us/framework-laptop-bios-and-driver-releases-12th-gen-intel-core-Bkx2kosqq)
 
 # Issues
 

one more TODO
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index fa3d3bde..e4be54d8 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -288,6 +288,14 @@ TODO: update [[hardware/laptop/angela]] with a pointer to this story
 TODO: inspect `/srv` from backups, see if we need to restore
 anything. probably some git-annex repositories.
 
+TODO: link to 
+https://www.westerndigital.com/en-ca/products/internal-drives/wd-blue-sn570-nvme-ssd#WDS100T3B0C
+https://www.samsung.com/us/computing/memory-storage/solid-state-drives/ssd-970-evo-nvme-m-2-1tb-mz-v7e1t0bw/
+WD blue was the curie backup, samsung is the live angela device, WD
+blue is now in the framework
+
+TODO: install the extra 16GB from the purism laptop into the framework
+
 # Issues
 
 To be determined.

progress on the framework hardware setup
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index ad8e1245..fa3d3bde 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -216,6 +216,78 @@ specs.
    competition (e.g. Dell XPS, Apple M1), but might be worth waiting
    for second generation
 
+# Hardware setup
+
+A breeze. The back cover is held together by five TorX screws, but
+there's a nice screwdriver/spudger that works well enough. (In fact, I
+love that thing and I think I'll carry it everywhere.) The keys
+actually hold in place so you can't even lose them.
+
+The first setup is a bit counter-intuitive coming from the Librem
+laptop, as I expected the back cover to lift and give me access to the
+internals. But what the screws do is release the keyboard and touch
+pad assembly, so you actually need to flip the laptop back upright and
+*lift the cover* (!) to get access to the internals.
+
+Once there, everything is well indicated, with QR codes all over the
+place. The QR codes I tested (in the expansion card slow, the memory
+slot and CPU slots) did not actually work (see below) so I wonder how
+useful those actually are. After all, they need to point to
+*something* and that means a URL, a running website that will answer
+those requests forever. I bet those will break sooner than later and
+in fact, as far as I can tell, they just don't work at all.
+
+I prefer the approach taken by the MNT reform here which designed
+(with the [100 rabbits folks](https://100r.co/)) an actual paper handbook.
+
+# Software setup
+
+This was less great. I couldn't boot off of the NVMe drive I
+transferred from the previous laptop (the
+[[Purism|hardware/purism-librem13v4]]) and the BIOS was not very
+helpful: it was just failing to find any boot device and complaining
+about it, without dropping me in the real BIOS. I figured out [how to
+enter BIOS](https://knowledgebase.frame.work/en_us/how-do-i-enter-the-bios-on-the-framework-laptop-HydmWf5Ad) (press <kbd>F2</kbd> manically), disable secure boot,
+and boot a [grml image](https://grml.org/).
+
+And by "boot" I mean, I managed to get to the grml boot loader which
+promptly failed to load its own root file system somehow. I still have
+to investigate exactly what happened there, but it failed some time
+after the initrd load with:
+
+    Unable to find medium containing a live file system
+
+I did manage to boot the [development version of the Debian
+installer](https://www.debian.org/devel/debian-installer/) which was a surprisingly good experience: it mounted the
+encrypted drives and did everything pretty smoothly. It even offered
+me to reinstall the bootloader, but that ultimately (and correctly, as
+it turns out) failed because I didn't have a `/boot/efi` partition.
+
+At this point, I realized there was no easy way out of this, and I
+just proceeded to completely reinstall. I had a spare NVMe drive lying
+around (backups FTW!) so I just swapped that in, rebooted in the
+Debian installer again, and did a clean install. I wanted to switch to
+bookworm anyways, so I guess that's done too.
+
+Another thing that happened during setup is that I tried to copy over
+the internal 2.5" SSD drive to the 1TB expansion card I bought from
+Framework, because there's no 2.5" slot in the framework laptop of
+course. I was tired and did something stupid and ended up wiping the
+partition table on the 2.5" drive. It *might* be recoverable, but just
+restoring it didn't work either, so I'm not sure how I recover the
+data there. Normally, everything on my laptops and workstations is
+designed to be disposable, but I'd certainly like to have some closure
+on that as well.
+
+Right now I'm copying the `/home` directory over. I'll probably
+bootstrap the system from Puppet by hand.
+
+TODO: compare package lists between backup and installed from Puppet
+TODO: restore SSH keys and Puppet certs from backups
+TODO: update [[hardware/laptop/angela]] with a pointer to this story
+TODO: inspect `/srv` from backups, see if we need to restore
+anything. probably some git-annex repositories.
+
 # Issues
 
 To be determined.

framework pros/cons updates
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 3575b227..ad8e1245 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -13,20 +13,12 @@ burning-in, setting up and using the device over the years.
 
 # Current status
 
-Right now we are at step 5: *shipping*! 
+I have the framework! I'm struggling with the UEFI configuration (had
+to reinstall Debian), but I'll get there.
 
 See also the bottom of the page for last update date for this specific
 page.
 
-Details: I pre-ordered a 12th gen, third batch, supposed to
-ship in "September", ~~but I suspect it will probably be October,
-considering they struggled to keep up with the August batch~~. 
-
-Update: looks like it will make in September! Amazing! Will probably
-reuse the NVMe drive from the [[Purism
-laptop|hardware/purism-librem13v4]], moving [[hardware/laptop/angela]]
-to a new body. Make sure to update the latter with details.
-
 ## The supply pipeline
 
 There are basically 6 steps in the Framework shipping pipeline, each
@@ -42,6 +34,11 @@ There are basically 6 steps in the Framework shipping pipeline, each
 This comes from the [crowdsourced spreadsheet](https://docs.google.com/spreadsheets/d/10bhWkvOnaLhFG7RsZmb0uwKo4F8tBJWlTqXToUyIDX0/edit#gid=1658320056), which should be
 updated when the status changes here.
 
+I was part of the "third batch" of the 12th generation laptop, which
+was supposed to ship in September. It ended up arriving on my door
+step on September 27th which is pretty good considering they had
+delays in the second batch (August).
+
 ## Shipping trivia
 
 I don't know about the others, but my laptop shipped through no less
@@ -174,8 +171,15 @@ specs.
    in October 2021. they generally seem to keep up with shipping;
    update (august 2022): they rolled out a second line of laptops
    (12th gen), first batch shipped, second batch [shipped late](https://www.reddit.com/r/framework/comments/wvt86e/update_on_batch_2_shipments/),
-   might delay third batch slated for September 2022, see [this
-   spreadsheet for a crowdsourced effort to track those](https://docs.google.com/spreadsheets/d/10bhWkvOnaLhFG7RsZmb0uwKo4F8tBJWlTqXToUyIDX0/edit#gid=1658320056)
+   September 2022 batch was generally on time, see [this spreadsheet
+   for a crowdsourced effort to track those](https://docs.google.com/spreadsheets/d/10bhWkvOnaLhFG7RsZmb0uwKo4F8tBJWlTqXToUyIDX0/edit#gid=1658320056)
+
+ * compared to my previous laptop (Purism Librem 13v4), it feels
+   strangely bulkier and heavier; it's actually *lighter* than the
+   purism (1.3kg vs 1.4kg) and thinner (15.85mm vs 18mm) but the
+   design of the framework (tapered edges) makes it *feel* thinner
+
+ * no space for a 2.5" drive
 
 Note: the following were written back when I was reading reviews about
 the 1th gen, and haven't been checked against the 12th gen nor its

one issue with qr codes
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index e9ea4a4c..3575b227 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -216,6 +216,16 @@ specs.
 
 To be determined.
 
+## First bad QR code
+
+The first qrcode that's immediately visible from the back of the
+laptop, in an expansion cord slot, is a 404. It *seems* to be some
+serial number URL, but I can't actually tell because, well, the page
+is a 404. :) I contacted support about this to see what's up.
+
+I was expecting that bar code to lead me to an introduction page,
+something like "how to setup your Framework laptop".
+
 # Other resources
 
  * [list of compatible USB-C docks](https://community.frame.work/t/usb-c-thunderbolt-dock-megathread/1460) but beware of the above

add metrics from the purism
diff --git a/blog/2022-09-28-suspend-battery-use.md b/blog/2022-09-28-suspend-battery-use.md
index f60f4359..b1957719 100644
--- a/blog/2022-09-28-suspend-battery-use.md
+++ b/blog/2022-09-28-suspend-battery-use.md
@@ -24,12 +24,41 @@ The simplest way I found to dump battery use is with [tlp program](https://linru
 
 This should show you something like this:
 
-    TODO: insert tlp-stat output
+    root@angela:~# tlp-stat  -b
+    --- TLP 1.3.1 --------------------------------------------
+
+    +++ Battery Features: Charge Thresholds and Recalibrate
+    natacpi    = inactive (laptop not supported)
+    tpacpi-bat = inactive (laptop not supported)
+    tp-smapi   = inactive (laptop not supported)
+
+    +++ Battery Status: BAT
+    /sys/class/power_supply/BAT/manufacturer                    = TPS
+    /sys/class/power_supply/BAT/model_name                      = S10
+    /sys/class/power_supply/BAT/cycle_count                     = (not supported)
+    /sys/class/power_supply/BAT/charge_full_design              =   6040 [mAh]
+    /sys/class/power_supply/BAT/charge_full                     =   6098 [mAh]
+    /sys/class/power_supply/BAT/charge_now                      =   6098 [mAh]
+    /sys/class/power_supply/BAT/current_now                     =    850 [mA]
+    /sys/class/power_supply/BAT/status                          = Full
+
+    Charge                                                      =  100.0 [%]
+    Capacity                                                    =  101.0 [%]
 
 Then you just need to hook that into a simple shell script, say in
-`/usr/lib/systemd/system-sleep/tlp-stat-bat`:
+`/lib/systemd/system-sleep/tlp-stat-battery`:
 
-    TODO: insert script here
+    #!/bin/sh
+
+    # tlp - systemd suspend/resume hook
+    #
+    # Copyright (c) 2020 Thomas Koch <linrunner at gmx.net> and others.
+    # This software is licensed under the GPL v2 or later.
+
+    case $1 in
+        pre)  tlp-stat -b ;;
+        post) tlp-stat -b ;;
+    esac
 
 Then when your laptop suspends, the script will run before sleep and
 dump the battery stats in the systemd journal (or syslog). When it
@@ -41,10 +70,56 @@ usage on my Purism Librem 13v4, for example.
 
 Before:
 
-    TODO
+    sep 28 11:19:45 angela systemd-sleep[209379]: --- TLP 1.3.1 --------------------------------------------
+    sep 28 11:19:45 angela systemd-sleep[209379]: +++ Battery Features: Charge Thresholds and Recalibrate
+    sep 28 11:19:45 angela systemd-sleep[209379]: natacpi    = inactive (laptop not supported)
+    sep 28 11:19:45 angela systemd-sleep[209379]: tpacpi-bat = inactive (laptop not supported)
+    sep 28 11:19:45 angela systemd-sleep[209379]: tp-smapi   = inactive (laptop not supported)
+    sep 28 11:19:45 angela systemd-sleep[209379]: +++ Battery Status: BAT
+    sep 28 11:19:45 angela systemd-sleep[209379]: /sys/class/power_supply/BAT/manufacturer                    = TPS
+    sep 28 11:19:45 angela systemd-sleep[209379]: /sys/class/power_supply/BAT/model_name                      = S10
+    sep 28 11:19:45 angela systemd-sleep[209379]: /sys/class/power_supply/BAT/cycle_count                     = (not supported)
+    sep 28 11:19:45 angela systemd-sleep[209379]: /sys/class/power_supply/BAT/charge_full_design              =   6040 [mAh]
+    sep 28 11:19:45 angela systemd-sleep[209379]: /sys/class/power_supply/BAT/charge_full                     =   6098 [mAh]
+    sep 28 11:19:45 angela systemd-sleep[209379]: /sys/class/power_supply/BAT/charge_now                      =   6045 [mAh]
+    sep 28 11:19:45 angela systemd-sleep[209379]: /sys/class/power_supply/BAT/current_now                     =   1024 [mA]
+    sep 28 11:19:45 angela systemd-sleep[209379]: /sys/class/power_supply/BAT/status                          = Discharging
+    sep 28 11:19:45 angela systemd-sleep[209655]: Charge                                                      =   99.1 [%]
+    sep 28 11:19:45 angela systemd-sleep[209656]: Capacity                                                    =  101.0 [%]
 
 After:
 
-    TODO
+    sep 28 11:29:47 angela systemd-sleep[209725]: --- TLP 1.3.1 --------------------------------------------
+    sep 28 11:29:47 angela systemd-sleep[209725]: +++ Battery Features: Charge Thresholds and Recalibrate
+    sep 28 11:29:47 angela systemd-sleep[209725]: natacpi    = inactive (laptop not supported)
+    sep 28 11:29:47 angela systemd-sleep[209725]: tpacpi-bat = inactive (laptop not supported)
+    sep 28 11:29:47 angela systemd-sleep[209725]: tp-smapi   = inactive (laptop not supported)
+    sep 28 11:29:47 angela systemd-sleep[209725]: +++ Battery Status: BAT
+    sep 28 11:29:47 angela systemd-sleep[209725]: /sys/class/power_supply/BAT/manufacturer                    = TPS
+    sep 28 11:29:47 angela systemd-sleep[209725]: /sys/class/power_supply/BAT/model_name                      = S10
+    sep 28 11:29:47 angela systemd-sleep[209725]: /sys/class/power_supply/BAT/cycle_count                     = (not supported)
+    sep 28 11:29:47 angela systemd-sleep[209725]: /sys/class/power_supply/BAT/charge_full_design              =   6040 [mAh]
+    sep 28 11:29:47 angela systemd-sleep[209725]: /sys/class/power_supply/BAT/charge_full                     =   6098 [mAh]
+    sep 28 11:29:47 angela systemd-sleep[209725]: /sys/class/power_supply/BAT/charge_now                      =   6037 [mAh]
+    sep 28 11:29:47 angela systemd-sleep[209725]: /sys/class/power_supply/BAT/current_now                     =    850 [mA]
+    sep 28 11:29:47 angela systemd-sleep[209961]: /dev/sda:
+    sep 28 11:29:47 angela systemd-sleep[209961]:  setting standby to 36 (3 minutes)
+    sep 28 11:29:47 angela systemd-sleep[209725]: /sys/class/power_supply/BAT/status                          = Discharging
+    sep 28 11:29:47 angela systemd-sleep[210013]: Charge                                                      =   99.0 [%]
+    sep 28 11:29:47 angela systemd-sleep[210018]: Capacity                                                    =  101.0 [%]
+    sep 28 11:29:47 angela systemd[1]: systemd-suspend.service: Succeeded.
+
+The important parts being of course:
+
+    sep 28 11:19:45 angela systemd-sleep[209379]: /sys/class/power_supply/BAT/charge_now                      =   6045 [mAh]
+    sep 28 11:29:47 angela systemd-sleep[209725]: /sys/class/power_supply/BAT/charge_now                      =   6037 [mAh]
+
+In other words, 8mAh were used in the 10 minutes (and 2 seconds) test
+I did. This works out to around 48mAh per hour, or, with this battery,
+about 127 hours or roughly 5 days.
+
+Obviously, an improvement could be to actually write this to a file,
+do the math and log only that. But that's more work and I'm lazy right
+now, exercise for the reader I guess.
 
 [[!tag draft]]

neat trick, unfinished
diff --git a/blog/2022-09-28-suspend-battery-use.md b/blog/2022-09-28-suspend-battery-use.md
new file mode 100644
index 00000000..f60f4359
--- /dev/null
+++ b/blog/2022-09-28-suspend-battery-use.md
@@ -0,0 +1,50 @@
+[[!meta title="Evaluating suspend battery use with systemd"]]
+
+This is a quick hack that will allow you to do some (manual)
+computations on power usage during suspend on your laptop, using
+systemd hooks.
+
+It might be possible to use a similar hack on non-systemd systems of
+course, you just need something that fires a hook on suspend and
+resume.
+
+On systemd, this happens thanks to the
+[systemd-suspend.service](https://www.freedesktop.org/software/systemd/man/systemd-suspend.service.html). That service is not designed to be
+called directly, but it fires off a series of hooks and targets that
+makes it possible to do things before and after suspend. There is a
+`sleep.target` that you can hook other services too, but the really
+much easier way is to just drop a shell script in
+`/usr/lib/systemd/system-sleep/`. 
+
+The simplest way I found to dump battery use is with [tlp program](https://linrunner.de/tlp/)
+([Debian package](https://tracker.debian.org/pkg/tlp)):
+
+    apt install tlp
+    tlp-stat -b
+
+This should show you something like this:
+
+    TODO: insert tlp-stat output
+
+Then you just need to hook that into a simple shell script, say in
+`/usr/lib/systemd/system-sleep/tlp-stat-bat`:
+
+    TODO: insert script here
+
+Then when your laptop suspends, the script will run before sleep and
+dump the battery stats in the systemd journal (or syslog). When it
+resumes, it will do the same, so you will be able to compare.
+
+Then a simple way to compare suspend usage is to suspend the laptop
+for (say) 10 minutes and see how much power was used. This is the
+usage on my Purism Librem 13v4, for example.
+
+Before:
+
+    TODO
+
+After:
+
+    TODO
+
+[[!tag draft]]

some shipping trivia
diff --git a/hardware/laptop/framework-12th-gen.md b/hardware/laptop/framework-12th-gen.md
index 83506a42..e9ea4a4c 100644
--- a/hardware/laptop/framework-12th-gen.md
+++ b/hardware/laptop/framework-12th-gen.md
@@ -13,9 +13,24 @@ burning-in, setting up and using the device over the years.
 
 # Current status
 
-Right now we are at step 5: *shipping*! There are basically 6 steps
-in the Framework shipping pipeline, each (except the last) accompanied
-with an email notification:
+Right now we are at step 5: *shipping*! 
+
+See also the bottom of the page for last update date for this specific
+page.
+
+Details: I pre-ordered a 12th gen, third batch, supposed to
+ship in "September", ~~but I suspect it will probably be October,
+considering they struggled to keep up with the August batch~~. 
+
+Update: looks like it will make in September! Amazing! Will probably
+reuse the NVMe drive from the [[Purism
+laptop|hardware/purism-librem13v4]], moving [[hardware/laptop/angela]]
+to a new body. Make sure to update the latter with details.
+
+## The supply pipeline
+
+There are basically 6 steps in the Framework shipping pipeline, each
+(except the last) accompanied with an email notification:
 
  1. pre-order
  2. preparing batch
@@ -27,17 +42,26 @@ with an email notification:
 This comes from the [crowdsourced spreadsheet](https://docs.google.com/spreadsheets/d/10bhWkvOnaLhFG7RsZmb0uwKo4F8tBJWlTqXToUyIDX0/edit#gid=1658320056), which should be
 updated when the status changes here.
 
-See also the bottom of the page for last update date for this specific
-page.
+## Shipping trivia
 
-Details: I pre-ordered a 12th gen, third batch, supposed to
-ship in "September", ~~but I suspect it will probably be October,
-considering they struggled to keep up with the August batch~~. Update:
-looks like it will make in September! Amazing! Will
-probably reuse the NVMe drive from the [[Purism
-laptop|hardware/purism-librem13v4]], moving [[hardware/laptop/angela]]
-to a new body. Make sure to update the latter with details, will
-probably move this section to a new page for review.
+I don't know about the others, but my laptop shipped through no less
+than *four* different airplane flights. Here are the hops it took:
+
+ * [Taoyuan, Taiwan](https://en.wikipedia.org/wiki/Taoyuan,_Taiwan) 2022-09-23
+ * [Anchorage, Alaska, USA](https://en.wikipedia.org/wiki/Anchorage,_Alaska) (?!) 2022-09-24
+ * [Memphis, Tennessee, USA](https://en.wikipedia.org/wiki/Memphis,_Tennessee) 2022-09-25
+ * [Winnipeg, Manitoba, Canada](https://en.wikipedia.org/wiki/Winnipeg) (!! back the wrong way!) 2022-09-26
+ * [Mirabel, Québec, Canada](https://en.wikipedia.org/wiki/Montr%C3%A9al%E2%80%93Mirabel_International_Airport) 2022-09-27
+ * [Montréal, Québec, Canada](https://en.wikipedia.org/wiki/Montreal)
+
+I can't quite figure out how to calculate exactly how much mileage
+that is, but it's huge. The ride through Alaska is surprising enough
+but the bounce back through *Winnipeg* is especially weird. I guess
+the route happens that way because of Fedex shipping hubs.
+
+There was a related oddity when I had my Purism laptop shipped: it
+left from the west coast and seemed to enter on an endless, two week
+long road trip across the continental US.
 
 # Specifications
 

tone it down
diff --git a/blog/2022-09-25-pourquoi-nationaliser.md b/blog/2022-09-25-pourquoi-nationaliser.md
index e88b3f28..6e3958a4 100644
--- a/blog/2022-09-25-pourquoi-nationaliser.md
+++ b/blog/2022-09-25-pourquoi-nationaliser.md
@@ -8,8 +8,7 @@ Québec doit nationaliser Internet parce que le moment est venu
 d’investir dans un réseau public moins cher, plus juste et
 décentralisé. Cet ambitieux projet pourrait révolutionner
 l’architecture de nos réseaux et permettre une plus grande innovation,
-et peut-être même contribuer à sauver l’humanité de la catastrophe
-climatique.
+et peut-être même aider à réduire nos dépenses énergétiques.
 
 [[!toc]]
 

more typos
diff --git a/blog/2022-09-25-pourquoi-nationaliser.md b/blog/2022-09-25-pourquoi-nationaliser.md
index 33bec917..e88b3f28 100644
--- a/blog/2022-09-25-pourquoi-nationaliser.md
+++ b/blog/2022-09-25-pourquoi-nationaliser.md
@@ -18,7 +18,7 @@ climatique.
 La première raison de reconsidérer l’architecture du réseau au Québec,
 est que c’est le bon moment. Partout au Québec, les municipalités
 doivent progressivement remplacer tout le système d’égouts désuets et d’eau
-potable comtaminés au [plomb][].
+potable contaminés au [plomb][].
 
 C’est une occasion unique d’installer un réseau de fibre optique. Ce
 n’est pas tous les jours qu’une ville ouvre tous ses soubassements.
@@ -92,14 +92,14 @@ nantis, qui n’ont pas accès aux meilleurs signaux plus coûteuses.
 Mais on pourrait aussi aller plus loin. Avec des vitesses passées le
 gigabit, il est possible d’héberger des services de tout genre à la
 maison. Normalement, ces services sont viables seulement dans un
-centre de données climatisés. J’en sais quelquechose, ayant co-fondé
+centre de données climatisés. J’en sais quelque chose, ayant co-fondé
 le [Réseau Koumbit][] il y a près de 20 ans maintenant. Les coûts
 d’une telle opération sont prohibitifs et font que Koumbit est, à ce
 jour, un des rares hébergeurs indépendants encore en opération au
 Québec.
 
 Tout le réseau est centralisé : la capacité est concentrée dans le
-centre-ville. En créant un réseau de fibre universe, tout point du
+centre-ville. En créant un réseau de fibre universel, tout point du
 réseau peut devenir un serveur. Ceci permettrait une plus saine
 compétition sur Internet, présentement dominé par les gros joueurs
 tels que Google, Amazon, Facebook, Apple et Microsoft.

un autre lien sur la haute vitesse
diff --git a/blog/2022-09-25-pourquoi-nationaliser.md b/blog/2022-09-25-pourquoi-nationaliser.md
index 84cd50b5..33bec917 100644
--- a/blog/2022-09-25-pourquoi-nationaliser.md
+++ b/blog/2022-09-25-pourquoi-nationaliser.md
@@ -64,10 +64,10 @@ dégressifs selon le revenu.
 
 Quand les gouvernements ont donné un milliard de dollars dans ces
 compagnies privées, ils ont établi un barème pour évaluer si les
-compagnies auraient fait leur travail. La barre de la “haute vitesse”
-a été mise assez basse : 50 mégabits par seconde. Or, ce niveau de
-service est disponible [depuis plus d’une décennie][], une éternité
-dans le domaine des technologies.
+compagnies auraient fait leur travail. La barre de la “[haute
+vitesse][]” a été mise assez basse : 50 mégabits par seconde. Or, ce
+niveau de service est disponible [depuis plus d’une décennie][], une
+éternité dans le domaine des technologies.
 
 Nous avons donc payé une fortune pour un réseau désuet.
 
@@ -104,6 +104,8 @@ réseau peut devenir un serveur. Ceci permettrait une plus saine
 compétition sur Internet, présentement dominé par les gros joueurs
 tels que Google, Amazon, Facebook, Apple et Microsoft.
 
+[haute vitesse]: https://www.ledevoir.com/opinion/chroniques/756822/chronique-promesse-de-politicien
+
 # Décentralisé
 
 Concrètement, un réseau public devrait être fédéré autour des

typos
diff --git a/blog/2022-09-25-pourquoi-nationaliser.md b/blog/2022-09-25-pourquoi-nationaliser.md
index a89916a6..84cd50b5 100644
--- a/blog/2022-09-25-pourquoi-nationaliser.md
+++ b/blog/2022-09-25-pourquoi-nationaliser.md
@@ -93,7 +93,7 @@ Mais on pourrait aussi aller plus loin. Avec des vitesses passées le
 gigabit, il est possible d’héberger des services de tout genre à la
 maison. Normalement, ces services sont viables seulement dans un
 centre de données climatisés. J’en sais quelquechose, ayant co-fondé
-le [Réseau Koumbit][] il y a près de 20 ans maintenant. Les coûts
+le [Réseau Koumbit][] il y a près de 20 ans maintenant. Les coûts
 d’une telle opération sont prohibitifs et font que Koumbit est, à ce
 jour, un des rares hébergeurs indépendants encore en opération au
 Québec.
@@ -131,7 +131,7 @@ en fournissant une dorsale pour d’autres fournisseurs Internet.
 
 Un réseau centralisé comme celui d’Amazon et Google peut permettre des
 économies énergétiques, car les compagnies ont intérêt à optimiser les
-ressources pour réduire leurs coûts. Mais leur modèle d’affaire —
+ressources pour réduire leurs coûts. Mais leur modèle d’affaire — 
 souvent basé sur la gratuité – cache parfois les coûts réels de
 ces produits.
 
@@ -140,7 +140,7 @@ dissipation de chaleur est un énorme problème dans ce modèle, par
 exemple : la vague de chaleur de cet été a mené à des [coupures de
 services nuagiques en Grande-Bretagne][]. Pire encore, la
 sur-utilisation de l’électricité par ces compagnies privées surcharge
-les réseaux électriques, à un tel point que [certaines quartiers de
+les réseaux électriques, à un tel point que [certains quartiers de
 Londres ne peuvent plus construire][london] pour adresser la crise du
 logement.
 

retirer l’exemple de l’irlande
c’est vrai qu’ils ont un backbone neutre:
https://en.wikipedia.org/wiki/Telecommunications_in_the_Republic_of_Ireland#Infrastructure
"94 Irish towns and cities also have access to publicly owned,
carrier-neutral metropolitan fibre networks managed by Enet.[5]"
http://www.enet.ie/
... mais les prix y semble *plus* élevés qu’à Montréal!
https://www.numbeo.com/cost-of-living/compare_cities.jsp?country1=Ireland&country2=Canada&city1=Dublin&city2=Montreal
https://www.dbresearch.com/PROD/RPS_EN-PROD/PROD0000000000494405.pdf?undefined&realload=ewqJGIh467YMtwT7zYnbXVKRj0NSnIGJ~oiFPRyvnSpz1HxX2KGHi2x4OHZa6YcT
diff --git a/blog/2022-09-25-pourquoi-nationaliser.md b/blog/2022-09-25-pourquoi-nationaliser.md
index ae065e50..a89916a6 100644
--- a/blog/2022-09-25-pourquoi-nationaliser.md
+++ b/blog/2022-09-25-pourquoi-nationaliser.md
@@ -127,11 +127,6 @@ compagnies. Bell Canada, par exemple, offre des services Internet,
 mais aussi téléphonique, télévision, journaux, magazines, radios, tout
 en fournissant une dorsale pour d’autres fournisseurs Internet.
 
-En Irlande, par exemple, l’état gère — par l’entremise d’une compagnie
-privée — les interconnexions et les compagnies offrent des services
-sur la couche supérieure : installation des modems, accès internet et
-service à la clientèle.
-
 # Sauver le climat
 
 Un réseau centralisé comme celui d’Amazon et Google peut permettre des

another massive edit, ~1200 words now
diff --git a/blog/2022-09-25-pourquoi-nationaliser.md b/blog/2022-09-25-pourquoi-nationaliser.md
index e9501a92..ae065e50 100644
--- a/blog/2022-09-25-pourquoi-nationaliser.md
+++ b/blog/2022-09-25-pourquoi-nationaliser.md
@@ -4,175 +4,155 @@ J’ai écrit un article un peu trop long sur [[comment nationaliser
 Internet|2022-08-26-nationalize-internet]] (en anglais) mais j’ai
 réalisé que je n’ai pas tant expliqué *pourquoi*.
 
-Québec doit nationaliser Internet parce que c’est le bon moment
-d’investir dans le futur pour se doter d’un réseau public moins cher,
-plus juste et décentralisé. Cet ambitieux projet pourrait
-révolutionner l’architecture de nos réseaux et permettre une plus
-grande innovation, et peut-être même contribuer à sauver l’humanité de
-la catastrophe climatique.
+Québec doit nationaliser Internet parce que le moment est venu
+d’investir dans un réseau public moins cher, plus juste et
+décentralisé. Cet ambitieux projet pourrait révolutionner
+l’architecture de nos réseaux et permettre une plus grande innovation,
+et peut-être même contribuer à sauver l’humanité de la catastrophe
+climatique.
 
 [[!toc]]
 
 # Bon moment
 
-La première raison de reconsidérer l’architecture du réseau en
-Amérique, et particulièrement au Québec, c’est que c’est le bon
-moment. Partout au Québec, les municipalités doivent progressivement
-remplacer tout le système d’égout et d’eau potable, particulièrement à
-Montréal où les [canalisations en plomb sont beaucoup plus présentes
-qu’on le pensait][plomb].
+La première raison de reconsidérer l’architecture du réseau au Québec,
+est que c’est le bon moment. Partout au Québec, les municipalités
+doivent progressivement remplacer tout le système d’égouts désuets et d’eau
+potable comtaminés au [plomb][].
 
-C’est une occasion unique d’installer un réseau de fibre public. Ce
-n’est pas tous les jours qu’une ville ouvre tous ses soubassements, il
-faut en profiter, maintenant. Plus largement, nos réseaux sont encore
-basés sur du cuivre — les vieux systèmes téléphonique et de télévision
-câblée — et nous achevons une transition vers de la fibre optique.
-La question est : à qui appartiendra cette ressource critique ?
+C’est une occasion unique d’installer un réseau de fibre optique. Ce
+n’est pas tous les jours qu’une ville ouvre tous ses soubassements.
+Il faut en profiter, maintenant.
 
+Plus largement, beaucoup de nos réseaux sont encore basés sur du
+cuivre — les vieux systèmes téléphonique et de télévision câblée — et
+nous achevons une transition vers de la fibre optique. La question
+est : à qui appartiendra cette ressource critique ?
 
 # Investir dans le futur
 
 Brancher tout le monde sur la fibre est un investissement, pas une
 dépense. Construire une infrastructure de fibre publique est un projet
-similaire à l’électrification du 20ᵉ siècle. Tout comme ce projet,
-nous pouvons choisir d’investir dans le privé ou dans le public ;
-d’investir dans une technologie désuète (le cuivre) ou qui nous
-amènera dans le prochain millénaire (la fibre).
-
-Présentement, nous choisissons d’investir dans le privé, dans un
-processus d’extraction de fonds public malheureusement trop commun, au
-profit de compagnies antiques possédant un réseau massif de cuivre. Au
-lieu de ce banditisme, nous pourrions créer un réseau
-public qui serait ultimement générateur de revenus, tout comme
+similaire à l’électrification du 20ᵉ siècle. Tout comme à cette époque
+nous pouvons choisir d’investir dans le privé ou dans le public, dans
+une technologie désuète (le cuivre) ou celle qui nous amènera dans le
+prochain millénaire (la fibre).
+
+Présentement, nous choisissons d’investir dans le privé au profit de
+compagnies antiques basées sur réseaux de cuivre, surtout dans le
+“dernier mille”. Au lieu de ce banditisme, nous pourrions créer un
+réseau public qui serait ultimement générateur de revenus, tout comme
 Hydro-Québec l’est désormais.
 
-Collectiviser est aussi le bon choix d’un point de vue purement
-économique. Les services internet municipaux ont un rapport
-qualité-prix inégalé. D’abord, il est évident que les marges de profit
-sont plus larges au privé, mais ensuite la qualité du service n’est
-pas artificiellement limitée par le fournisseur.
-
 # Par justice
 
 L’accès Internet n’est plus seulement un privilège, c’est un droit. Il
-faut par exemple avoir accès à Internet pour [franchir la
-frontière][], et de plus en plus de services migrent en ligne.
+faut par exemple avoir accès à Internet pour [franchir la frontière
+canadienne][], et de plus en plus de services migrent en ligne.
 
 Présentement, l’accès internet est une forme de taxe privée,
-régressive, qui défavorise davantage les pauvres, qui peuvent souvent
-pas se permettre de débourser 50-100$/mois pour accéder au réseau des
-réseaux.
+régressive. Cette situation défavorise davantage les pauvres, qui ne
+peuvent souvent pas se permettre de débourser 50-100$/mois pour
+accéder au réseau.
 
 Établir un réseau public n’éliminerait pas complètement ces
 disparités, mais permettrait d’établir des critères plus justes pour
 permettre l’accès Internet, par exemple en offrant des tarifs
 dégressifs selon le revenu.
 
-[franchir la frontière]: https://www.ledevoir.com/opinion/idees/748461/idees-le-dangereux-precedent-d-arrivecan
-
 # Innovant
 
-Quand les gouvernements ont investi un milliard de dollars dans ces
-réseaux privés, ils ont établi ce qu’on considère comme la “haute
-vitesse”, un barème pour évaluer si les compagnies auraient fait leur
-travail. La barre a été mise assez basse : 50 mégabits par seconde. Or,
-ce niveau de service est disponible depuis plus d’une décennie, une
-éternité dans le domaine des technologies.
+Quand les gouvernements ont donné un milliard de dollars dans ces
+compagnies privées, ils ont établi un barème pour évaluer si les
+compagnies auraient fait leur travail. La barre de la “haute vitesse”
+a été mise assez basse : 50 mégabits par seconde. Or, ce niveau de
+service est disponible [depuis plus d’une décennie][], une éternité
+dans le domaine des technologies.
 
-Nous avons donc payé une fortune pour un réseau largement désuet.
+Nous avons donc payé une fortune pour un réseau désuet.
 
-Si, à l’inverse, nous aurions investi dans un réseau de fibre optique,
-évolutif, il aurait été facile d’offrir des services plus performants.
-La municipalité de [Chattanooga][] au Tennessee vient
+Si, à l’inverse, nous investissons dans un réseau de fibre optique,
+évolutif, il sera facile d’offrir des services plus performants à
+l’avenir. La municipalité de [Chattanooga][] au Tennessee vient
 d’implanter un service 25 *gigabit* — c’est-à-dire 25 000 mégabits par
 seconde — soit 500 fois plus performant que le standard établi au
 Québec. Pour ce faire, la ville n’a pas eu à rouvrir des canalisations
-ou passer des nouveaux fils ; la fibre installée en 2010 — alors qu’ils
-offraient déjà du 1 000 mégabit par seconde — était parfaitement
-suffisante. Il a suffi de changer les équipements aux deux bouts.
+ou passer des nouveaux fils ; la fibre installée en 2010 était
+parfaitement suffisante.
 
 De telles vitesses donnent le vertige, et on est en droit de se
-demander à quoi toute cette vitesse pourrait-elle bien servir. Mais la
-venue du travail à distance a véritablement changé la donne : la
-vidéo-conférence, autrefois artefact de science-fiction, est
-maintenant dans la vie de tous les jours. Et bien que, par miracle,
-nos réseaux de cuivre arrivent à fournir à la demande, ce n’est pas
-sans d’énormes compromis au niveau de la qualité du signal.
-Ultimement, on défavorise encore la participation des moins nantis,
-qui n’ont pas accès aux hautes vitesses plus coûteuses.
-
-Mais on peut aussi aller plus loin encore. Il y a presque 20 dans de
-cela, je participais à la fondation du [Réseau Koumbit][] qui a pour
-mission (entre autres) de favoriser l’autonomie des groupes sociaux
-québecois. Concrètement, ceci implique l’hébergement de dizaines de
-serveurs branchés à de la fibre optique dans un centre de
-données. Les coûts d’une telle opération sont prohibitifs et font que
-Koumbit est, à ce jour, probablement une des seules organisations de
-ce genre au Québec encore en opération.
-
-Le problème est que le réseau est centralisé : la vitesse est
-concentrée dans le centre-ville. En créant un réseau de fibre
-universel, soudainement, tout point du réseau peut devenir un
-véritable serveur. Ceci permettrait une plus saine compétition
-sur Internet, présentement dominé par les gros joueurs tels que
-Google, Amazon, Facebook, Apple et Microsoft.
+demander à quoi elle pourrait bien servir. Mais la venue du travail à
+distance a changé la donne : la vidéo-conférence, autrefois artefact
+de science-fiction, est maintenant dans la vie de tous les jours. Et
+bien que, par miracle, nos réseaux de cuivre arrivent à fournir à la
+demande, ce n’est pas sans compromis au niveau de la qualité du
+signal. Ultimement, on défavorise encore la participation des moins
+nantis, qui n’ont pas accès aux meilleurs signaux plus coûteuses.
+
+Mais on pourrait aussi aller plus loin. Avec des vitesses passées le
+gigabit, il est possible d’héberger des services de tout genre à la
+maison. Normalement, ces services sont viables seulement dans un
+centre de données climatisés. J’en sais quelquechose, ayant co-fondé
+le [Réseau Koumbit][] il y a près de 20 ans maintenant. Les coûts
+d’une telle opération sont prohibitifs et font que Koumbit est, à ce
+jour, un des rares hébergeurs indépendants encore en opération au
+Québec.
+
+Tout le réseau est centralisé : la capacité est concentrée dans le
+centre-ville. En créant un réseau de fibre universe, tout point du
+réseau peut devenir un serveur. Ceci permettrait une plus saine
+compétition sur Internet, présentement dominé par les gros joueurs
+tels que Google, Amazon, Facebook, Apple et Microsoft.
 
 # Décentralisé
 
-On conçoit souvent l’état comme un système bureaucratique et
-centralisé, ce qui peut être vrai. Mais les gouvernements sont
-parfois étonnamment décentralisés, selon un modèle où les décisions
-sont — idéalement, bien sûr — prises au niveau affecté par ladite
-décision.
-
 Concrètement, un réseau public devrait être fédéré autour des
 municipalités et des [MRC][]s, chacune ayant l’autonomie de gérer son
 propre réseau. Ceci éliminerait toute une classe de problèmes
 similaire à la [coupure de service catastrophique de Rogers de juillet
-2022][].
+2022][], ayant affecté des clients d’un océan à l’autre.

(Diff truncated)
regroup links
diff --git a/blog/2022-09-25-pourquoi-nationaliser.md b/blog/2022-09-25-pourquoi-nationaliser.md
index 1177c11d..e9501a92 100644
--- a/blog/2022-09-25-pourquoi-nationaliser.md
+++ b/blog/2022-09-25-pourquoi-nationaliser.md
@@ -29,7 +29,6 @@ basés sur du cuivre — les vieux systèmes téléphonique et de télévision
 câblée — et nous achevons une transition vers de la fibre optique.
 La question est : à qui appartiendra cette ressource critique ?
 
-[plomb]: https://www.ledevoir.com/societe/sante/567857/comprendre-le-dossier-du-plomb-dans-l-eau-au-quebec
 
 # Investir dans le futur
 
@@ -118,9 +117,6 @@ véritable serveur. Ceci permettrait une plus saine compétition
 sur Internet, présentement dominé par les gros joueurs tels que
 Google, Amazon, Facebook, Apple et Microsoft.
 
-[Réseau Koumbit]: https://koumbit.org
-[Chattanooga]: https://en.wikipedia.org/wiki/Chattanooga,_Tennessee
-
 # Décentralisé
 
 On conçoit souvent l’état comme un système bureaucratique et
@@ -143,9 +139,6 @@ dans la mesure bien sûr où le provincial puisse fournir des dorsales
 ou au moins les ressources financières pour interconnecter certaines
 régions éloignées…
 
-[MRC]: https://fr.wikipedia.org/wiki/Municipalit%C3%A9_r%C3%A9gionale_de_comt%C3%A9
-[coupure de service catastrophique de Rogers de juillet 2022]: https://ici.radio-canada.ca/nouvelle/1896581/panne-connexion-service-majeur-interruption-fournisseur-web
-
 Même si on ne désire pas investir autant dans ces infrastructures, il
 faudrait à tout le moins avoir une dorsale partagée, quitte à ce
 qu’elle soit gérée par une compagnie privée. Présentement, les
@@ -186,6 +179,13 @@ Peut-être que, de cette façon, nous sauverions aussi des coûts
 réutilisant des machines qui, la plupart du temps, ne servent pas à
 grand-chose à la maison.
 
+[plomb]: https://www.ledevoir.com/societe/sante/567857/comprendre-le-dossier-du-plomb-dans-l-eau-au-quebec
+[franchir la frontière canadienne]: https://www.ledevoir.com/opinion/idees/748461/idees-le-dangereux-precedent-d-arrivecan
+[Réseau Koumbit]: https://koumbit.org
+[Chattanooga]: https://en.wikipedia.org/wiki/Chattanooga,_Tennessee
+[depuis plus d’une décennie]: https://web.archive.org/web/20090621065516/http://www.videotron.com/service/services-internet/acces-internet
+[MRC]: https://fr.wikipedia.org/wiki/Municipalit%C3%A9_r%C3%A9gionale_de_comt%C3%A9
+[coupure de service catastrophique de Rogers de juillet 2022]: https://ici.radio-canada.ca/nouvelle/1896581/panne-connexion-service-majeur-interruption-fournisseur-web
 [coupures de services nuagiques en Grande-Bretagne]: https://gizmodo.com/google-oracle-cloud-heatwave-europe-1849199124
 [certaines régions de Londres ne peuvent pas construire]: https://gizmodo.com/data-centers-london-tech-electric-grid-1849342150
 

fr typography, l’Internet -> Internet
diff --git a/blog/2022-09-25-pourquoi-nationaliser.md b/blog/2022-09-25-pourquoi-nationaliser.md
index 054cd359..1177c11d 100644
--- a/blog/2022-09-25-pourquoi-nationaliser.md
+++ b/blog/2022-09-25-pourquoi-nationaliser.md
@@ -1,33 +1,33 @@
-[[!meta title="Pourquoi nationaliser l'Internet au Québec"]]
+[[!meta title="Pourquoi nationaliser Internet au Québec"]]
 
-J'ai écrit un article un peu trop long sur [[comment nationaliser
-l'Internet|2022-08-26-nationalize-internet]] (en anglais) mais j'ai
-réalisé que je n'ai pas tant expliqué *pourquoi*. 
+J’ai écrit un article un peu trop long sur [[comment nationaliser
+Internet|2022-08-26-nationalize-internet]] (en anglais) mais j’ai
+réalisé que je n’ai pas tant expliqué *pourquoi*.
 
-Québec doit nationaliser l'Internet parce que c'est le bon moment
-d'investir dans le futur pour se doter d'un réseau public moins cher,
+Québec doit nationaliser Internet parce que c’est le bon moment
+d’investir dans le futur pour se doter d’un réseau public moins cher,
 plus juste et décentralisé. Cet ambitieux projet pourrait
-révolutionner l'architecture de nos réseaux et permettre une plus
-grande innovation, et peut-être même contribuer à sauver l'humanité de
+révolutionner l’architecture de nos réseaux et permettre une plus
+grande innovation, et peut-être même contribuer à sauver l’humanité de
 la catastrophe climatique.
 
 [[!toc]]
 
 # Bon moment
 
-La première raison de reconsidérer l'architecture du réseau en
-Amérique, et particulièrement au Québec, c'est que c'est le bon
+La première raison de reconsidérer l’architecture du réseau en
+Amérique, et particulièrement au Québec, c’est que c’est le bon
 moment. Partout au Québec, les municipalités doivent progressivement
-remplacer tout le système d'égout et d'eau potable, particulièrement à
+remplacer tout le système d’égout et d’eau potable, particulièrement à
 Montréal où les [canalisations en plomb sont beaucoup plus présentes
-qu'on le pensait][plomb].
+qu’on le pensait][plomb].
 
-C'est une occasion unique d'installer un réseau de fibre public. Ce
-n'est pas tous les jours qu'une ville ouvre tous ses soubassements, il
+C’est une occasion unique d’installer un réseau de fibre public. Ce
+n’est pas tous les jours qu’une ville ouvre tous ses soubassements, il
 faut en profiter, maintenant. Plus largement, nos réseaux sont encore
 basés sur du cuivre — les vieux systèmes téléphonique et de télévision
 câblée — et nous achevons une transition vers de la fibre optique.
-La question est: à qui appartiendra cette ressource critique?
+La question est : à qui appartiendra cette ressource critique ?
 
 [plomb]: https://www.ledevoir.com/societe/sante/567857/comprendre-le-dossier-du-plomb-dans-l-eau-au-quebec
 
@@ -35,120 +35,83 @@ La question est: à qui appartiendra cette ressource critique?
 
 Brancher tout le monde sur la fibre est un investissement, pas une
 dépense. Construire une infrastructure de fibre publique est un projet
-similaire à l'électrification du 20ᵉ siècle. Tout comme ce projet,
-nous pouvons choisir d'investir dans le privé ou dans le public;
-d'investir dans une technologie désuète (le cuivre) ou qui nous
+similaire à l’électrification du 20ᵉ siècle. Tout comme ce projet,
+nous pouvons choisir d’investir dans le privé ou dans le public ;
+d’investir dans une technologie désuète (le cuivre) ou qui nous
 amènera dans le prochain millénaire (la fibre).
 
-Présentement, nous choisissons d'investir dans le privé, dans un
-processus d'extraction de fonds public malheureusement trop commun, au
+Présentement, nous choisissons d’investir dans le privé, dans un
+processus d’extraction de fonds public malheureusement trop commun, au
 profit de compagnies antiques possédant un réseau massif de cuivre. Au
 lieu de ce banditisme, nous pourrions créer un réseau
 public qui serait ultimement générateur de revenus, tout comme
-Hydro-Québec l'est désormais.
+Hydro-Québec l’est désormais.
 
-Collectiviser est aussi le bon choix d'un point de vue purement
+Collectiviser est aussi le bon choix d’un point de vue purement
 économique. Les services internet municipaux ont un rapport
-qualité-prix inégalé. D'abord, il est évident que les marges de profit
-sont plus larges au privé, mais ensuite la qualité du service n'est
+qualité-prix inégalé. D’abord, il est évident que les marges de profit
+sont plus larges au privé, mais ensuite la qualité du service n’est
 pas artificiellement limitée par le fournisseur.
 
 # Par justice
 
-L'accès Internet n'est plus seulement un privilège, c'est un droit. Il
+L’accès Internet n’est plus seulement un privilège, c’est un droit. Il
 faut par exemple avoir accès à Internet pour [franchir la
 frontière][], et de plus en plus de services migrent en ligne.
 
-Présentement, l'accès internet est une forme de taxe privée,
+Présentement, l’accès internet est une forme de taxe privée,
 régressive, qui défavorise davantage les pauvres, qui peuvent souvent
 pas se permettre de débourser 50-100$/mois pour accéder au réseau des
 réseaux.
 
-Établir un réseau public n'éliminerait pas complètement ces
-disparités, mais permettrait d'établir des critères plus justes pour
-permettre l'accès Internet, par exemple en offrant des tarifs
+Établir un réseau public n’éliminerait pas complètement ces
+disparités, mais permettrait d’établir des critères plus justes pour
+permettre l’accès Internet, par exemple en offrant des tarifs
 dégressifs selon le revenu.
 
 [franchir la frontière]: https://www.ledevoir.com/opinion/idees/748461/idees-le-dangereux-precedent-d-arrivecan
 
-# Décentralisé
-
-On conçoit souvent l'état comme un système bureaucratique et
-centralisé, ce qui peut être vrai. Mais les gouvernements sont
-parfois étonnamment décentralisés, selon un modèle où les décisions
-sont — idéalement, bien sûr — prises au niveau affecté par ladite
-décision.
-
-Concrètement, un réseau public devrait être fédéré autour des
-municipalités et des [MRC][]s, chacune ayant l'autonomie de gérer son
-propre réseau. Ceci éliminerait toute une classe de problèmes
-similaire à la [coupure de service catastrophique de Rogers de juillet
-2022][].
-
-Ceci peut sembler une idée bizarre, mais c'est en fait la façon dont
-beaucoup de services publics sont gérés. Les transports en commun, la
-collecte des ordures, la voirie, ces compétences sont généralement
-d'ordre municipal, et il devrait être de même des télécommunications,
-dans la mesure bien sûr où le provincial puisse fournir des dorsales
-ou au moins les ressources financières pour interconnecter certaines
-régions éloignées...
-
-[MRC]: https://fr.wikipedia.org/wiki/Municipalit%C3%A9_r%C3%A9gionale_de_comt%C3%A9
-[coupure de service catastrophique de Rogers de juillet 2022]: https://ici.radio-canada.ca/nouvelle/1896581/panne-connexion-service-majeur-interruption-fournisseur-web
-
-Même si on ne désire pas investir autant dans ces infrastructures, il
-faudrait à tout le moins avoir une dorsale partagée, quitte à ce
-qu'elle soit gérée par une compagnie privée. Présentement, les
-dorsales sont toutes gérées par les mêmes compagnies qui fournissent
-l'accès internet, mais aussi téléphonique, télévision, journaux,
-magazines, radios, etc. La centralisation est catastrophique, les
-conflits d'intérêts rampants, et la qualité en souffre. En Irlande,
-par exemple, l'état gère — par l'entremise d'une compagnie privée —
-les interconnexions et les compagnies offrent des services sur la
-couche supérieure: installation des modems, accès internet et service à
-la clientèle.
-
 # Innovant
 
 Quand les gouvernements ont investi un milliard de dollars dans ces
-réseaux privés, ils ont établi ce qu'on considère comme la "haute
-vitesse", un barème pour évaluer si les compagnies auraient fait leur
-travail. La barre a été mise assez basse: 50 mégabits par seconde. Or,
-ce niveau de service est disponible depuis plus d'une décennie, une
+réseaux privés, ils ont établi ce qu’on considère comme la “haute
+vitesse”, un barème pour évaluer si les compagnies auraient fait leur
+travail. La barre a été mise assez basse : 50 mégabits par seconde. Or,
+ce niveau de service est disponible depuis plus d’une décennie, une
 éternité dans le domaine des technologies.
 
 Nous avons donc payé une fortune pour un réseau largement désuet.
 
-Si, à l'inverse, nous aurions investi dans un réseau de fibre optique,
-évolutif, il aurait été facile d'offrir des services plus performants.
+Si, à l’inverse, nous aurions investi dans un réseau de fibre optique,
+évolutif, il aurait été facile d’offrir des services plus performants.
 La municipalité de [Chattanooga][] au Tennessee vient
-d'implanter un service 25 *gigabit* — c'est-à-dire 25 000 mégabits par
+d’implanter un service 25 *gigabit* — c’est-à-dire 25 000 mégabits par
 seconde — soit 500 fois plus performant que le standard établi au
-Québec. Pour ce faire, la ville n'a pas eu à rouvrir des canalisations
-ou passer des nouveaux fils; la fibre installée en 2010 — alors qu'ils
+Québec. Pour ce faire, la ville n’a pas eu à rouvrir des canalisations
+ou passer des nouveaux fils ; la fibre installée en 2010 — alors qu’ils
 offraient déjà du 1 000 mégabit par seconde — était parfaitement
 suffisante. Il a suffi de changer les équipements aux deux bouts.
 
 De telles vitesses donnent le vertige, et on est en droit de se
 demander à quoi toute cette vitesse pourrait-elle bien servir. Mais la
-venue du travail à distance a véritablement changé la donne: la
+venue du travail à distance a véritablement changé la donne : la
 vidéo-conférence, autrefois artefact de science-fiction, est
 maintenant dans la vie de tous les jours. Et bien que, par miracle,
-nos réseaux de cuivre arrivent à fournir à la demande, ce n'est pas
-sans d'énormes compromis au niveau de la qualité du signal.
+nos réseaux de cuivre arrivent à fournir à la demande, ce n’est pas
+sans d’énormes compromis au niveau de la qualité du signal.
 Ultimement, on défavorise encore la participation des moins nantis,
-qui n'ont pas accès aux hautes vitesses plus coûteuses.
+qui n’ont pas accès aux hautes vitesses plus coûteuses.
 
 Mais on peut aussi aller plus loin encore. Il y a presque 20 dans de
 cela, je participais à la fondation du [Réseau Koumbit][] qui a pour
-mission (entre autres) de favoriser l'autonomie des groupes sociaux
-québecois. Concrètement, ceci implique l'hébergement de dizaines de
+mission (entre autres) de favoriser l’autonomie des groupes sociaux
+québecois. Concrètement, ceci implique l’hébergement de dizaines de
 serveurs branchés à de la fibre optique dans un centre de
-données. Les coûts d'une telle opération sont prohibitifs et font que
+données. Les coûts d’une telle opération sont prohibitifs et font que
 Koumbit est, à ce jour, probablement une des seules organisations de
 ce genre au Québec encore en opération.
 

(Diff truncated)
flycheck-grammalecte ftw
diff --git a/blog/2022-09-25-pourquoi-nationaliser.md b/blog/2022-09-25-pourquoi-nationaliser.md
index 5d7f213f..054cd359 100644
--- a/blog/2022-09-25-pourquoi-nationaliser.md
+++ b/blog/2022-09-25-pourquoi-nationaliser.md
@@ -19,7 +19,7 @@ La première raison de reconsidérer l'architecture du réseau en
 Amérique, et particulièrement au Québec, c'est que c'est le bon
 moment. Partout au Québec, les municipalités doivent progressivement
 remplacer tout le système d'égout et d'eau potable, particulièrement à
-Montréal où les [canalisations en plomb sont beaucoup plus présente
+Montréal où les [canalisations en plomb sont beaucoup plus présentes
 qu'on le pensait][plomb].
 
 C'est une occasion unique d'installer un réseau de fibre public. Ce
@@ -35,7 +35,7 @@ La question est: à qui appartiendra cette ressource critique?
 
 Brancher tout le monde sur la fibre est un investissement, pas une
 dépense. Construire une infrastructure de fibre publique est un projet
-similaire à l'électrification du 20e siècle. Tout comme ce projet,
+similaire à l'électrification du 20ᵉ siècle. Tout comme ce projet,
 nous pouvons choisir d'investir dans le privé ou dans le public;
 d'investir dans une technologie désuète (le cuivre) ou qui nous
 amènera dans le prochain millénaire (la fibre).
@@ -113,7 +113,7 @@ la clientèle.
 Quand les gouvernements ont investi un milliard de dollars dans ces
 réseaux privés, ils ont établi ce qu'on considère comme la "haute
 vitesse", un barème pour évaluer si les compagnies auraient fait leur
-travail. La barre à été mise assez basse: 50 mégabits par seconde. Or,
+travail. La barre a été mise assez basse: 50 mégabits par seconde. Or,
 ce niveau de service est disponible depuis plus d'une décennie, une
 éternité dans le domaine des technologies.
 
@@ -127,7 +127,7 @@ seconde — soit 500 fois plus performant que le standard établi au
 Québec. Pour ce faire, la ville n'a pas eu à rouvrir des canalisations
 ou passer des nouveaux fils; la fibre installée en 2010 — alors qu'ils
 offraient déjà du 1 000 mégabit par seconde — était parfaitement
-suffisante. Il a suffit de changer les équipements aux deux bouts.
+suffisante. Il a suffi de changer les équipements aux deux bouts.
 
 De telles vitesses donnent le vertige, et on est en droit de se
 demander à quoi toute cette vitesse pourrait-elle bien servir. Mais la
@@ -163,7 +163,7 @@ Google, Amazon, Facebook, Apple et Microsoft.
 Un réseau centralisé comme celui d'Amazon et Google permet
 possiblement certaines économies énergétiques, ces compagnies ayant
 intérêt à optimiser les ressources pour utiliser réduire leurs
-coûts. Mais leur modèle d'affaire — souvent basé sur la gratuité —
+coûts. Mais leur modèle d'affaire — souvent basé sur la gratuité – 
 cache parfois les coûts réels de l'utilisation de ces ressources.
 
 Ultimement, les gros centres de données mènent à de graves gaspillages

libreoffice-grammalecte ftw
diff --git a/blog/2022-09-25-pourquoi-nationaliser.md b/blog/2022-09-25-pourquoi-nationaliser.md
index e9c62f5a..5d7f213f 100644
--- a/blog/2022-09-25-pourquoi-nationaliser.md
+++ b/blog/2022-09-25-pourquoi-nationaliser.md
@@ -26,8 +26,8 @@ C'est une occasion unique d'installer un réseau de fibre public. Ce
 n'est pas tous les jours qu'une ville ouvre tous ses soubassements, il
 faut en profiter, maintenant. Plus largement, nos réseaux sont encore
 basés sur du cuivre — les vieux systèmes téléphonique et de télévision
-câblée — et nous achevons une transition vers de la fibre optique mur
-à mur. La question est: à qui appartiendra cette ressource critique?
+câblée — et nous achevons une transition vers de la fibre optique.
+La question est: à qui appartiendra cette ressource critique?
 
 [plomb]: https://www.ledevoir.com/societe/sante/567857/comprendre-le-dossier-du-plomb-dans-l-eau-au-quebec
 
@@ -43,7 +43,7 @@ amènera dans le prochain millénaire (la fibre).
 Présentement, nous choisissons d'investir dans le privé, dans un
 processus d'extraction de fonds public malheureusement trop commun, au
 profit de compagnies antiques possédant un réseau massif de cuivre. Au
-lieu de cette approche banditiste, nous pourrions créer un réseau
+lieu de ce banditisme, nous pourrions créer un réseau
 public qui serait ultimement générateur de revenus, tout comme
 Hydro-Québec l'est désormais.
 
@@ -60,7 +60,7 @@ faut par exemple avoir accès à Internet pour [franchir la
 frontière][], et de plus en plus de services migrent en ligne.
 
 Présentement, l'accès internet est une forme de taxe privée,
-régressive, qui défavorise d'avantage les pauvres, qui peuvent souvent
+régressive, qui défavorise davantage les pauvres, qui peuvent souvent
 pas se permettre de débourser 50-100$/mois pour accéder au réseau des
 réseaux.
 
@@ -105,12 +105,12 @@ magazines, radios, etc. La centralisation est catastrophique, les
 conflits d'intérêts rampants, et la qualité en souffre. En Irlande,
 par exemple, l'état gère — par l'entremise d'une compagnie privée —
 les interconnexions et les compagnies offrent des services sur la
-couche supérieur: installation des modems, accès internet et service à
+couche supérieure: installation des modems, accès internet et service à
 la clientèle.
 
 # Innovant
 
-Quand les gouvernements ont investi un milliard de dollar dans ces
+Quand les gouvernements ont investi un milliard de dollars dans ces
 réseaux privés, ils ont établi ce qu'on considère comme la "haute
 vitesse", un barème pour évaluer si les compagnies auraient fait leur
 travail. La barre à été mise assez basse: 50 mégabits par seconde. Or,
@@ -120,19 +120,19 @@ ce niveau de service est disponible depuis plus d'une décennie, une
 Nous avons donc payé une fortune pour un réseau largement désuet.
 
 Si, à l'inverse, nous aurions investi dans un réseau de fibre optique,
-évolutif, il aurait été facile d'offrir des services très grande
-vitesse. La municipalité de [Chattanooga][] au Tennessee vient
-d'implanter un service 25 *gigabit* — c'est à dire 25 000 mégabits par
+évolutif, il aurait été facile d'offrir des services plus performants.
+La municipalité de [Chattanooga][] au Tennessee vient
+d'implanter un service 25 *gigabit* — c'est-à-dire 25 000 mégabits par
 seconde — soit 500 fois plus performant que le standard établi au
 Québec. Pour ce faire, la ville n'a pas eu à rouvrir des canalisations
 ou passer des nouveaux fils; la fibre installée en 2010 — alors qu'ils
-offraient déjà du 1 000 megabit par seconde — était parfaitement
+offraient déjà du 1 000 mégabit par seconde — était parfaitement
 suffisante. Il a suffit de changer les équipements aux deux bouts.
 
 De telles vitesses donnent le vertige, et on est en droit de se
 demander à quoi toute cette vitesse pourrait-elle bien servir. Mais la
 venue du travail à distance a véritablement changé la donne: la
-vidéo-conférence, autrefois artefact de science fiction, est
+vidéo-conférence, autrefois artefact de science-fiction, est
 maintenant dans la vie de tous les jours. Et bien que, par miracle,
 nos réseaux de cuivre arrivent à fournir à la demande, ce n'est pas
 sans d'énormes compromis au niveau de la qualité du signal.
@@ -140,18 +140,18 @@ Ultimement, on défavorise encore la participation des moins nantis,
 qui n'ont pas accès aux hautes vitesses plus coûteuses.
 
 Mais on peut aussi aller plus loin encore. Il y a presque 20 dans de
-cela, je participait à la fondation du [Réseau Koumbit][] qui a pour
+cela, je participais à la fondation du [Réseau Koumbit][] qui a pour
 mission (entre autres) de favoriser l'autonomie des groupes sociaux
 québecois. Concrètement, ceci implique l'hébergement de dizaines de
-serveurs branchés à de la fibre optique dans une centre de
+serveurs branchés à de la fibre optique dans un centre de
 données. Les coûts d'une telle opération sont prohibitifs et font que
 Koumbit est, à ce jour, probablement une des seules organisations de
 ce genre au Québec encore en opération.
 
 Le problème est que le réseau est centralisé: la vitesse est
 concentrée dans le centre-ville. En créant un réseau de fibre
-universel, soudainement, tout point du réseau peut devenir un serveur
-réellement haute vitesse. Ceci permettrait un plus saine compétition
+universel, soudainement, tout point du réseau peut devenir un
+véritable serveur. Ceci permettrait une plus saine compétition
 sur Internet, présentement dominé par les gros joueurs tels que
 Google, Amazon, Facebook, Apple et Microsoft.
 
@@ -160,7 +160,7 @@ Google, Amazon, Facebook, Apple et Microsoft.
 
 # Sauver le climat
 
-Un réseau centralisé comme celui de Amazon et Google permet
+Un réseau centralisé comme celui d'Amazon et Google permet
 possiblement certaines économies énergétiques, ces compagnies ayant
 intérêt à optimiser les ressources pour utiliser réduire leurs
 coûts. Mais leur modèle d'affaire — souvent basé sur la gratuité —
@@ -184,7 +184,7 @@ contenus en ligne.
 Peut-être que, de cette façon, nous sauverions aussi des coûts
 écologiques, en économisant des frais de climatisation et en
 réutilisant des machines qui, la plupart du temps, ne servent pas à
-grand chose à la maison.
+grand-chose à la maison.
 
 [coupures de services nuagiques en Grande-Bretagne]: https://gizmodo.com/google-oracle-cloud-heatwave-europe-1849199124
 [certaines régions de Londres ne peuvent pas construire]: https://gizmodo.com/data-centers-london-tech-electric-grid-1849342150

quelques autres corrections (merci mgp)
diff --git a/blog/2022-09-25-pourquoi-nationaliser.md b/blog/2022-09-25-pourquoi-nationaliser.md
index d731e629..e9c62f5a 100644
--- a/blog/2022-09-25-pourquoi-nationaliser.md
+++ b/blog/2022-09-25-pourquoi-nationaliser.md
@@ -19,8 +19,8 @@ La première raison de reconsidérer l'architecture du réseau en
 Amérique, et particulièrement au Québec, c'est que c'est le bon
 moment. Partout au Québec, les municipalités doivent progressivement
 remplacer tout le système d'égout et d'eau potable, particulièrement à
-Montréal où les [canalisation en plomb sont beaucoup plus présente
-qu'on le pensait][].
+Montréal où les [canalisations en plomb sont beaucoup plus présente
+qu'on le pensait][plomb].
 
 C'est une occasion unique d'installer un réseau de fibre public. Ce
 n'est pas tous les jours qu'une ville ouvre tous ses soubassements, il
@@ -29,7 +29,7 @@ basés sur du cuivre — les vieux systèmes téléphonique et de télévision
 câblée — et nous achevons une transition vers de la fibre optique mur
 à mur. La question est: à qui appartiendra cette ressource critique?
 
-[canalisation en plomb sont beaucoup plus présente qu'on le pensait]: https://www.ledevoir.com/societe/sante/567857/comprendre-le-dossier-du-plomb-dans-l-eau-au-quebec
+[plomb]: https://www.ledevoir.com/societe/sante/567857/comprendre-le-dossier-du-plomb-dans-l-eau-au-quebec
 
 # Investir dans le futur
 
@@ -47,14 +47,11 @@ lieu de cette approche banditiste, nous pourrions créer un réseau
 public qui serait ultimement générateur de revenus, tout comme
 Hydro-Québec l'est désormais.
 
-Nationaliser est aussi le bon choix d'un point de vue purement
-économique. Les municipalités ayant nationalisé l'Internet —
-[Chattanooga, Tennessee][] est l'exemple le plus frappant — ont un
-rapport qualité-prix inégalé. D'abord, il est évident que les marges
-de profit sont plus larges au privé, mais ensuite la qualité du
-service n'est pas artificiellement limitée par le fournisseur.
-
-[Chattanooga, Tennessee]: https://en.wikipedia.org/wiki/Chattanooga,_Tennessee
+Collectiviser est aussi le bon choix d'un point de vue purement
+économique. Les services internet municipaux ont un rapport
+qualité-prix inégalé. D'abord, il est évident que les marges de profit
+sont plus larges au privé, mais ensuite la qualité du service n'est
+pas artificiellement limitée par le fournisseur.
 
 # Par justice
 
@@ -77,15 +74,16 @@ dégressifs selon le revenu.
 # Décentralisé
 
 On conçoit souvent l'état comme un système bureaucratique et
-centralisé, ce qui est souvent vrai. Mais les gouvernements sont
-souvent étonnamment décentralisés, selon un modèle où les décisions
+centralisé, ce qui peut être vrai. Mais les gouvernements sont
+parfois étonnamment décentralisés, selon un modèle où les décisions
 sont — idéalement, bien sûr — prises au niveau affecté par ladite
 décision.
 
 Concrètement, un réseau public devrait être fédéré autour des
-municipalités et les [MRC][]s, chacune ayant l'autonomie de gérer son
-propre réseau. Ceci éliminerait toute une classe de problèmes tel que
-la [coupure de service catastrophique de Rogers de juillet 2022][].
+municipalités et des [MRC][]s, chacune ayant l'autonomie de gérer son
+propre réseau. Ceci éliminerait toute une classe de problèmes
+similaire à la [coupure de service catastrophique de Rogers de juillet
+2022][].
 
 Ceci peut sembler une idée bizarre, mais c'est en fait la façon dont
 beaucoup de services publics sont gérés. Les transports en commun, la
@@ -123,10 +121,10 @@ Nous avons donc payé une fortune pour un réseau largement désuet.
 
 Si, à l'inverse, nous aurions investi dans un réseau de fibre optique,
 évolutif, il aurait été facile d'offrir des services très grande
-vitesse. Reprenant l'exemple de Chattanooga, où ils viennent de
-déployer un service 25 *gigabit* — c'est à dire 25 000 mégabits par
-seconde — soit 500 fois plus performant que celui offert par le
-privée. Pour ce faire, la ville n'a pas eu à rouvrir des canalisations
+vitesse. La municipalité de [Chattanooga][] au Tennessee vient
+d'implanter un service 25 *gigabit* — c'est à dire 25 000 mégabits par
+seconde — soit 500 fois plus performant que le standard établi au
+Québec. Pour ce faire, la ville n'a pas eu à rouvrir des canalisations
 ou passer des nouveaux fils; la fibre installée en 2010 — alors qu'ils
 offraient déjà du 1 000 megabit par seconde — était parfaitement
 suffisante. Il a suffit de changer les équipements aux deux bouts.
@@ -158,6 +156,7 @@ sur Internet, présentement dominé par les gros joueurs tels que
 Google, Amazon, Facebook, Apple et Microsoft.
 
 [Réseau Koumbit]: https://koumbit.org
+[Chattanooga]: https://en.wikipedia.org/wiki/Chattanooga,_Tennessee
 
 # Sauver le climat
 

approve comment
diff --git a/blog/2022-08-22-gmpc-alternatives/comment_1_ba6b8281b573543523ced9d0be531633._comment b/blog/2022-08-22-gmpc-alternatives/comment_1_ba6b8281b573543523ced9d0be531633._comment
new file mode 100644
index 00000000..50c92a50
--- /dev/null
+++ b/blog/2022-08-22-gmpc-alternatives/comment_1_ba6b8281b573543523ced9d0be531633._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ ip="51.83.68.185"
+ subject="Cantata"
+ date="2022-09-23T17:24:55Z"
+ content="""
+I've been a happy MPD user for like 15 years, and I am really sad to see the Cantata repository archived by its author. It's the client with all the features I've ever needed, and it's been flawless for all these years. Chapeau to its author! Sadly, I can't find any actively maintained full-featured MPD client out there either. I'll stick with Cantata until it breaks.
+"""]]

fix link to scroll(1)
diff --git a/blog/2022-09-19-wayland-terminal-emulators.md b/blog/2022-09-19-wayland-terminal-emulators.md
index 4b5c3da3..7c3dbe97 100644
--- a/blog/2022-09-19-wayland-terminal-emulators.md
+++ b/blog/2022-09-19-wayland-terminal-emulators.md
@@ -73,7 +73,7 @@ command. Neither are as satisfactory as just clicking a damn link.
 [image previews]: https://kde.org/announcements/gear/21.08.0/
 [sixel images]: https://kde.org/announcements/gear/22.04.0/
 [SSH plugin]: https://kde.org/announcements/gear/21.12.0/
-[scroll(1)]: https://st.suckless.org/patches/scrollback/
+[scroll(1)]: https://tools.suckless.org/scroll/
 [scrollback.patch]: https://st.suckless.org/patches/scrollback/
 
 # Requirements

nitpick
diff --git a/blog/2022-09-25-pourquoi-nationaliser.md b/blog/2022-09-25-pourquoi-nationaliser.md
index 139efc33..d731e629 100644
--- a/blog/2022-09-25-pourquoi-nationaliser.md
+++ b/blog/2022-09-25-pourquoi-nationaliser.md
@@ -187,7 +187,7 @@ Peut-être que, de cette façon, nous sauverions aussi des coûts
 réutilisant des machines qui, la plupart du temps, ne servent pas à
 grand chose à la maison.
 
-[[!tag draft]]
-
 [coupures de services nuagiques en Grande-Bretagne]: https://gizmodo.com/google-oracle-cloud-heatwave-europe-1849199124
 [certaines régions de Londres ne peuvent pas construire]: https://gizmodo.com/data-centers-london-tech-electric-grid-1849342150
+
+[[!tag draft]]

re-edit
diff --git a/blog/2022-09-25-pourquoi-nationaliser.md b/blog/2022-09-25-pourquoi-nationaliser.md
index 2b39f2b5..139efc33 100644
--- a/blog/2022-09-25-pourquoi-nationaliser.md
+++ b/blog/2022-09-25-pourquoi-nationaliser.md
@@ -4,18 +4,19 @@ J'ai écrit un article un peu trop long sur [[comment nationaliser
 l'Internet|2022-08-26-nationalize-internet]] (en anglais) mais j'ai
 réalisé que je n'ai pas tant expliqué *pourquoi*. 
 
-Je pense qu'il faut nationaliser parce que c'est le bon moment
+Québec doit nationaliser l'Internet parce que c'est le bon moment
 d'investir dans le futur pour se doter d'un réseau public moins cher,
-plus juste et décentralisé. Ce projet pourrait révolutionner
-l'architecture de nos réseaux et permettre une plus grande innovation,
-et peut-être même, ultimement, sauver l'humanité.
+plus juste et décentralisé. Cet ambitieux projet pourrait
+révolutionner l'architecture de nos réseaux et permettre une plus
+grande innovation, et peut-être même contribuer à sauver l'humanité de
+la catastrophe climatique.
 
 [[!toc]]
 
 # Bon moment
 
 La première raison de reconsidérer l'architecture du réseau en
-amérique, et particulièrement au Québec, c'est que c'est le bon
+Amérique, et particulièrement au Québec, c'est que c'est le bon
 moment. Partout au Québec, les municipalités doivent progressivement
 remplacer tout le système d'égout et d'eau potable, particulièrement à
 Montréal où les [canalisation en plomb sont beaucoup plus présente
@@ -23,26 +24,30 @@ qu'on le pensait][].
 
 C'est une occasion unique d'installer un réseau de fibre public. Ce
 n'est pas tous les jours qu'une ville ouvre tous ses soubassements, il
-faut en profiter, maintenant.
+faut en profiter, maintenant. Plus largement, nos réseaux sont encore
+basés sur du cuivre — les vieux systèmes téléphonique et de télévision
+câblée — et nous achevons une transition vers de la fibre optique mur
+à mur. La question est: à qui appartiendra cette ressource critique?
 
 [canalisation en plomb sont beaucoup plus présente qu'on le pensait]: https://www.ledevoir.com/societe/sante/567857/comprendre-le-dossier-du-plomb-dans-l-eau-au-quebec
 
 # Investir dans le futur
 
-C'est aussi un investissement, pas une dépense. Construire une
-infrastructure de fibre publique est un projet similaire à
-l'électrification du 20e siècle. Tout comme ce projet, nous pouvons
-choisir d'investir dans le privé ou dans le public; d'investir dans
-une technologie désuète (le cuivre) ou qui nous amènera dans le
-prochain millénaire (la fibre).
+Brancher tout le monde sur la fibre est un investissement, pas une
+dépense. Construire une infrastructure de fibre publique est un projet
+similaire à l'électrification du 20e siècle. Tout comme ce projet,
+nous pouvons choisir d'investir dans le privé ou dans le public;
+d'investir dans une technologie désuète (le cuivre) ou qui nous
+amènera dans le prochain millénaire (la fibre).
 
 Présentement, nous choisissons d'investir dans le privé, dans un
 processus d'extraction de fonds public malheureusement trop commun, au
-profit de compagnies antiques possédant un réseau massif de cuivre.
+profit de compagnies antiques possédant un réseau massif de cuivre. Au
+lieu de cette approche banditiste, nous pourrions créer un réseau
+public qui serait ultimement générateur de revenus, tout comme
+Hydro-Québec l'est désormais.
 
-# Moins cher
-
-Nationaliser est le bon choix d'un point de vue purement
+Nationaliser est aussi le bon choix d'un point de vue purement
 économique. Les municipalités ayant nationalisé l'Internet —
 [Chattanooga, Tennessee][] est l'exemple le plus frappant — ont un
 rapport qualité-prix inégalé. D'abord, il est évident que les marges
@@ -51,22 +56,21 @@ service n'est pas artificiellement limitée par le fournisseur.
 
 [Chattanooga, Tennessee]: https://en.wikipedia.org/wiki/Chattanooga,_Tennessee
 
-# Plus juste
+# Par justice
 
-L'accès Internet n'est plus seulement un privilège, ce doit être un
-droit. Il faut par exemple avoir accès à Internet pour [franchir la
+L'accès Internet n'est plus seulement un privilège, c'est un droit. Il
+faut par exemple avoir accès à Internet pour [franchir la
 frontière][], et de plus en plus de services migrent en ligne.
 
 Présentement, l'accès internet est une forme de taxe privée,
-régressive, qui défavorise d'avantage les défavorisés, qui peuvent
-parfois pas se permettre de débourser 50-100$/mois pour accéder au
-réseau des réseaux.
+régressive, qui défavorise d'avantage les pauvres, qui peuvent souvent
+pas se permettre de débourser 50-100$/mois pour accéder au réseau des
+réseaux.
 
-Établir un réseau public n'éliminerait pas nécessairement ces coûts,
-mais permettrait au public d'établir des critères plus justes pour
+Établir un réseau public n'éliminerait pas complètement ces
+disparités, mais permettrait d'établir des critères plus justes pour
 permettre l'accès Internet, par exemple en offrant des tarifs
-dégressifs selon le revenu, ou en garantissant un accès de base à
-toute la population.
+dégressifs selon le revenu.
 
 [franchir la frontière]: https://www.ledevoir.com/opinion/idees/748461/idees-le-dangereux-precedent-d-arrivecan
 
@@ -78,52 +82,54 @@ souvent étonnamment décentralisés, selon un modèle où les décisions
 sont — idéalement, bien sûr — prises au niveau affecté par ladite
 décision.
 
-Concrètement, il serait possible de créer un réseau public fédéré basé
-sur les municipalités et les [MRC][]s, chacune ayant l'autonomie de
-gérer son propre réseau. Ceci éliminerait toute une classe de
-problèmes tel que la [coupure de service catastrophique de Rogers de
-juillet 2022][].
+Concrètement, un réseau public devrait être fédéré autour des
+municipalités et les [MRC][]s, chacune ayant l'autonomie de gérer son
+propre réseau. Ceci éliminerait toute une classe de problèmes tel que
+la [coupure de service catastrophique de Rogers de juillet 2022][].
 
 Ceci peut sembler une idée bizarre, mais c'est en fait la façon dont
 beaucoup de services publics sont gérés. Les transports en commun, la
 collecte des ordures, la voirie, ces compétences sont généralement
-d'ordre municipal, et il devrait être de même des
-télécommunications. Dans la mesure bien sûr où le provincial puisse
-fournir des dorsales ou au moins les ressources financières pour
-interconnecter certaines régions éloignées...
+d'ordre municipal, et il devrait être de même des télécommunications,
+dans la mesure bien sûr où le provincial puisse fournir des dorsales
+ou au moins les ressources financières pour interconnecter certaines
+régions éloignées...
 
 [MRC]: https://fr.wikipedia.org/wiki/Municipalit%C3%A9_r%C3%A9gionale_de_comt%C3%A9
 [coupure de service catastrophique de Rogers de juillet 2022]: https://ici.radio-canada.ca/nouvelle/1896581/panne-connexion-service-majeur-interruption-fournisseur-web
 
 Même si on ne désire pas investir autant dans ces infrastructures, il
-faudrait à tout le monde avoir une dorsale partagée, quitte à ce
+faudrait à tout le moins avoir une dorsale partagée, quitte à ce
 qu'elle soit gérée par une compagnie privée. Présentement, les
 dorsales sont toutes gérées par les mêmes compagnies qui fournissent
 l'accès internet, mais aussi téléphonique, télévision, journaux,
 magazines, radios, etc. La centralisation est catastrophique, les
-conflits d'intérêts rampants, et la qualité en souffre.
+conflits d'intérêts rampants, et la qualité en souffre. En Irlande,
+par exemple, l'état gère — par l'entremise d'une compagnie privée —
+les interconnexions et les compagnies offrent des services sur la
+couche supérieur: installation des modems, accès internet et service à
+la clientèle.
 
 # Innovant
 
 Quand les gouvernements ont investi un milliard de dollar dans ces
-réseaux privés, ils ont réglé un standard de ce qu'on considère comme
-la "haute vitesse", un barème pour évaluer si les compagnies auraient
-fait leur travail. La barre à été mise assez basse: 50 mégabits par
-seconde. Ce genre de service est disponible depuis plus d'une
-décennie, une éternité dans le domaine des technologies.
+réseaux privés, ils ont établi ce qu'on considère comme la "haute
+vitesse", un barème pour évaluer si les compagnies auraient fait leur
+travail. La barre à été mise assez basse: 50 mégabits par seconde. Or,
+ce niveau de service est disponible depuis plus d'une décennie, une
+éternité dans le domaine des technologies.
 
-Ainsi donc, nous avons payé une fortune pour nous doter d'un réseau de
-piètre qualité, largement désuet.
+Nous avons donc payé une fortune pour un réseau largement désuet.
 
-À l'inverse, si nous aurions investi dans un réseau de fibre optique,
+Si, à l'inverse, nous aurions investi dans un réseau de fibre optique,
 évolutif, il aurait été facile d'offrir des services très grande
-vitesse. Reprenant l'exemple de Chattanooga, ils viennent de déployer
-un service 25 *gigabit* — c'est à dire 25 000 mégabits par seconde —
-soit 500 fois plus performant que celui offert par le privée. Et pour
-ce faire, la ville n'a pas eu à rouvrir des canalisations et passer
-des nouveaux fils; la fibre installée en 2010 — alors qu'ils offraient
-déjà du 1 000 megabit par seconde — était parfaitement suffisante. Il
-a suffit de changer les équipements aux deux bouts.
+vitesse. Reprenant l'exemple de Chattanooga, où ils viennent de
+déployer un service 25 *gigabit* — c'est à dire 25 000 mégabits par
+seconde — soit 500 fois plus performant que celui offert par le
+privée. Pour ce faire, la ville n'a pas eu à rouvrir des canalisations
+ou passer des nouveaux fils; la fibre installée en 2010 — alors qu'ils
+offraient déjà du 1 000 megabit par seconde — était parfaitement
+suffisante. Il a suffit de changer les équipements aux deux bouts.
 
 De telles vitesses donnent le vertige, et on est en droit de se
 demander à quoi toute cette vitesse pourrait-elle bien servir. Mais la
@@ -131,25 +137,25 @@ venue du travail à distance a véritablement changé la donne: la
 vidéo-conférence, autrefois artefact de science fiction, est
 maintenant dans la vie de tous les jours. Et bien que, par miracle,
 nos réseaux de cuivre arrivent à fournir à la demande, ce n'est pas
-sans d'énormes compromis au niveau de la qualité du signal et,
-ultimement, encore de défavoriser la participation des moins nantis,
+sans d'énormes compromis au niveau de la qualité du signal.
+Ultimement, on défavorise encore la participation des moins nantis,
 qui n'ont pas accès aux hautes vitesses plus coûteuses.
 
 Mais on peut aussi aller plus loin encore. Il y a presque 20 dans de
 cela, je participait à la fondation du [Réseau Koumbit][] qui a pour
 mission (entre autres) de favoriser l'autonomie des groupes sociaux
-québecois. Concrètement, ceci a impliqué une présence dans un centre
-de données et l'hébergement de dizaines de serveurs branchés à de la
-fibre optique. Les coûts d'une telle opération sont assez prohibitifs

(Diff truncated)

Archival link:

The above link creates a machine-readable RSS feed that can be used to easily archive new changes to the site. It is used by internal scripts to do sanity checks on new entries in the wiki.

Created . Edited .