Recurse Center Checkins
My occasional/semi-regular checkins that I wrote to account my time at Recurse Center. The point of checkins are to keep track of what I work on, who I work with, and the social events I go to. These are short but down to the point summaries of what I've done.
2024-08-02
Browser Phone Presentation Link
What I've done
- Browser Phone Stuff:
- So much progress! See the slides for more.
- Paired with [[@Sam Woldy]] on handling Janus Gateway h264 encoding -- we figured out how to force Janus to send iFrames when you load the page by toggling
videobufferkf = true
.
- Wrapped it all in typescript with bun (as all things should be). Started using fluent ffmpeg which is a super cool ffmpeg wrapper for typescript. Also learned about adb-ts, which is something I was considering making for this project that I no longer have to. Wrapping it with typescript made it more robust. Who would've thought.
- It works! Kinda. I can now stream an android the the browser with very low latency, it loads almost instantly, and it usually does not lag out over time. There's still a bunch of flags and settings I need to adjust though.
- Presented on the progress! I aimed for 6 seconds per slide, 30 slides. I averaged about 8 :(. This means that I didn't get to see if anyone wants to help on the next part: figuring out how to write typescript C bindings to recreate
scrcpy
's custom binary data packets for actually controlling the phone. I'll be writing my first lines of C next week hopefully, for the better or the worse. In the words of scrcpy, "the documentation is the unit tests." Also thanks [[@Eric Hayes]] for helping me figure out a bit about c and c structs. C design patterns do seem a bit funky.
- Later I figured out how to modify media encoder options. Basically there are two ways I found from reading some java source:
video_codec_options=bitrate-mode=4,latency:float=0.5
basically just add the constant's names and their values using this funky syntax. It seems to do things. The media codec options are all here, and you just need to find the string literal values associated with the constants.
- Edit the java code itself. I figured out enough Gradle to build scrcpy server. This is important because they decided to hard code some codec settings that I wanted to change :(
- Starting today to dockerize android emulators with nix. This may finally convince me to get a more powerful laptop, since it turns out baking docker images is slow. Or maybe just remote builds on AWS.
- Obsidian Contact Importer
- I use Obsidian for a lot, but one thing that I've wanted to use it for for a while but couldn't is contact management. I have a lot of contacts in my phone, and wanted to export them all to schema'd markdown so that I could load it into Obsidian. There were a few challenges, like vCards being a pain in the neck to deal with, or handling base64 images embedded in the vCards, but it works now! You give it a
vcards.vcf
file and a template.md
and it uses handlebars to produce the output contacts.
- Began pairing with [[Anna Hope|@Anna Hope]] a few weeks ago, and then did a long pairing session with [[@Eric Hayes|@Eric Hayes]], and afterwards finally got it working for my needs.
- PR'd Obsidian @ linking to make it so that my contacts get prefixed with a literal
@
- This works well enough for my needs now so I will get back to making this bidirectional (markdown -> vcards) later.
- iClicker Store
- Some professors at my University require iClickers, which are physical polling devices, for classes. They are really expensive at the book store but I get them very cheap in bulk so that I can resell them. This week I shipped iclickwolf.com to facilitate preorderes for next year. It was my first stripe integration and was a lot of fun to figure out. Stripe is so easy! My takeaway: the devex for tooling is better whan the people creating the devex are making money on you using it. I don't really like that takeaway though. Also, MUI is great.
2024-07-09
What I've done
- Got my Obsidian plugin working! I can edit posts, fetch posts, and more! I can now do blogging in Obsidian and ship to my website.
- More system configuration -- I set up more Hyprland keybinds to deal with multiple monitors.
- Wrote some screenshot related scripts. I'm almost done with a cool
gif
one where I can select a region of my screen, record a gif, have it copied to clipboard, and then paste it. Bash scripting with nix is so much fun! You have access to basically every binary ever. Maybe I'll give a talk about it.
Social stuff
- Prospect park run with @Seamus Edson (he) (S1'24) and @Seth Walker (he) (SP2'24). Was a really good pace!
- Board game club! Thanks everyone who came -- there's so many people I won't be able to @ everyone. Looks like there's a lot of Summer-2 board game interest which is great.
Non programming stuff (new bullet!)
What I want to do
- Finish up Obsidian plugin so I can look into the WebRTC stuff that forever seems to get pushed back.
- Blog about nix, the obsidian plugin creating process, and a few other things.
- Read Rust book a little -- I've fallen behind. I left my laptop home today, so I decided to instead of heading back and forth, do a virtual focused day at home; it was productive but I look forward to being at the hub again.
Ideas
- Scraping an airline website, making an API for the scraping, then having notifications for price drops. Predicting flight prices by logging huge amounts of data this way would be a fun intro to ML project.
2024-07-08
What I've done
- Got my Obsidian extension to work for my website for PULLing content. I can download all my blogs and project posts now, and the images are linked properly. I had to do a little bit of remark/unified AST stuff to swap out photo IDs with their filenames, because of how file linking works in Obsidian. I will probably present on this because it's so cool!
- Paired with @Joseph Martinez (he) (S1'24) on his medical charting platform. Was really fun to return to Next.js, it's been so long! The bug was that he had an element that was trying to access an element directly off of
window
, and next
and react
have various rendering stages where window
doesn't exist in the global scope. In this case, we were using a client side component, but the code was being "loaded" during pre-rendering (and maybe within the virtual DOM after mounting?), and couldn't access window
. The error message was obtuse, I'm going to steal links from Joseph's checkin:https://nextjs.org/docs/messages/prerender-error & https://nextjs.org/docs/pages/building-your-application/optimizing/lazy-loading#with-no-ssr
- Some more neovim config. I'm really happy with my current setup, it's really nice now. I definitely want to set up a dap (debugger) soon.
- Did a hello world in rust! I want to start reading "the book" and playing around a bit. Hope to pair with @Rylee Alanza Lyman (they) (S1'24) to work on some advent of code problems in rust once I get a little bit more fluent.
- Chatted with Peter (I didn't get a last name and there's so many peters!) about blender stuff. Maybe I'll return to it and play with the API.
What I want to do
- Still actually get started on webrtc stuff. I've been so distracted.
- Starting blogging more. I end up getting too obsessed with the technical side of my blog than actually blogging!
2024-07-05
What I've done
- I implemented everything in python! Basically, it's a library that dynamically generates the functions you import from it, so you can import literally anything from it.
- Some work on an obsidian plugin to sync my website blogs. Paired with @Thomas Georg Marwitz (he) (S2'24) to work on this a bit, and got to toy around with debug tools for Obsidian a bit.
- Chatted with @Dennis Owrutsky (he) (S2'24) about his ML project, and about first class objects / functions in Python. Turns out that my understanding of what it means for something to be first class was a bit off. Also lead into a tangent to learn about javascript symbols
Social stuff
- Talked to @Russell Webb (he) (F1'23) a bit about how he makes checkins less overwhelming, I might try his approach of reading specific checkins of people with overlapping interests instead of trying to get myself to read every single checkin everyone writes.
- Went to @Rylee Alanza Lyman (they) (S1'24)'s 4th of July party! It was so much fun to hang out with everyone and meet some new people. So many illegal fireworks around the area!
- Running group!!! Ran today with @Carsten Rodin (he) (S1'24) and @Elijah Reissman Kennedy (he) (S1'24). Was a good run around the park loop. We discussed the idea of making an IOT locker that locks to bike racks for your backpack when you run -- want to look into how to go about making this.
What I want to do
- Get started looking into how webrdp works, if there's rust backends for it, and maybe build a basic front end client for it
- Clean up my android emulator code and look into generating nix to do android stuff, probably with rust
2024-06-30
Learned about git submodules! Thanks @Charles Eckman (he) (SP2'24) for the tip. I have moved out my neovim config to here and now have it as a submodule in my nix configuration.
2024-06-27
Lots has happened since my last checkin, so this one's going to be rather long. I'm going to try to get into the flow of bi-daily checkins going foward! .
Code stuff:
- Working on wrapping my neovim so that it knows where all my LSPs live. I don't want to use
nixnvim
to build my neovim config, since I want to be able to use the config anywhere. But I also don't want to pollute my path with LSPs. So, I basically just wrapped neovim with a shell script to automatically put LSPs in the path.
- Paired with @Charles Eckman (he) (SP2'24)
- Getting a nix dev environment set up for tawaylon -- lots of
LD_LIRBARY_PATH
extension that feels very janky. I want to check [this out]( https://github.com/NixOS/patchelf) soon, which is an alternative that patches dynamic linked deps with static ones automatically.
- Learning a lot about dynamic and static dispatch functions, and a tour of rust. Thank you again, it was super helpful!
- Mozilla approved my extension! It's a tool to automatically skip past Zoom "open in desktop app" popups, taking you directly to browser zoom. Google rejected me twice now, so I need to update the chrome version based on their feedback and try again.
- Went to OS Discussion and talked about
dynamic linking
and systemd
a bit. I was going to set up a systemd
automount service, but got sidetracked and came in underprepared, so we talked about the dynamic linking I was doing with Charles, which turned out to be very OS-related anyway.
- Paired with @Joseph Martinez (he) (S1'24) to work on mktute a bit more and add tests, but instead we learned about github workflows and set up jest, and I got to do a bit of janky bash scripting. Was a lot of fun!
- Configured firefox with Nix to build my firefox configuration and extensions in a pure way.
- Began working on a Nixified minecraft network to learn arion and nixpkgs docker (a way to build super minimal base docker images). Was able to get a really cool missile wars implementation working, and packaged it with nix and maven. Made a PR and it looks like they aren't as big Nix fans as me. I want to also look into terraform more to automatically deploy it. The idea is that I'll use something like Bungeecord, a reverse proxy for minecraft servers, to manage a network of many nix packaged dockerized servers running different flavors and versions of the game.
- Got a look at @Divya _ (she) (S1'24)'s new elixer raft setup. Exlier seems super cool. Also chatted about the possibility of having a group next half batch to watch an opencourseware on distributed systems, which would be super cool.
- Wrote Hyprland Dash to Dock, a tool to create hideable ephemeral windows with the Hyprland window manager. It's still buggy and implemented a bit jankily, and I kinda want to redo it in rust to learn some rust. Regardless I need to do some bug fixing.
- Began trying to package KRDP, but wasn't successful. I am going to return to this eventually and make a PR with a nix flake when I get it to work. It's a wayland native RDP client.
- Learned about Lotion font from @Benjamin Arnav (he/they) (SP2'24) today, and want to try it out later.
Social stuff
- ALGORAVE. There are so many people to @ so I'll just leave it at that. Thank you @Paolo Holinski (he) (SP2'24) for organizing and for everyone who helped! It was such a fun experience.
- Sunday picnic! Again so many people to @. It was a great experience and was a ton of fun to hang out with everyone who went!
- Saw space jam (organized by @Peter Kang (he) (SP2'24)). I don't think I've seen it fully before -- it was fun to watch with everyone.
- Went to AITinkerer's Prompt Engineering event with a few people. It was a lot of fun! It was a content to prompt "low quality" AI models to behave in specific complex ways.
- Niceties and end of batch stuff! It's too bad that so many people won't be here the next 6 weeks. Unfortunately I had to go a little bit early since I had an important class (I'm taking a late night corporate finance course) I needed to attend.
Todos
- Fix my sleep schedule! My sleep/breakfast schedule is many hours in the wrong direction so I need to work on it. This checkin was sent wayy too late at night :((
- Get back to running! @Elijah Reissman Kennedy (he) (S1'24) and I are going to put running on the calendar next week at least one day, TBD
- Try out LARPing at Empire's Grove. It's been many years and I'm excited to get back into it.
- Read over everyone's #welcomes. I also need to read through a lot of checkins and get back in sync with Zulip in general.
- I still want to form a git group. I will eventually get around to this! Probably will post something Monday.
Ideas!
- I want to knock off appetize.io but open source! I want to make an android emulator that can be used as a web component and runs android and eventually IOS in a serverless context. Basically, the idea is to use nix to get an android emulator to run (which is so easy!), and stream the emulator (probably with looking glass). I want to have a server that can spawn lambdas with android emulators, and then returns
iframe
s that are phone emulators! And I want to learn rust in the process to build the backend. I don't really know where to start, so I want to research this tomorrow. This may be my next half batch project, maybe.
2024-06-11
A checkin! It's been a while, and a lot of things have happened. I'm going to get better at being consistent with this. This is a conglomeration of about a week worth of stuff I've done, so it's on the longer end.
Things I've been working on...
- Paired with @Joseph Martinez (he) (S1'24) recently to work on mktute, a super cool tutorial generating tool that uses GPT to make tutorials based on git diffs. I started working to refactor with
typescript
, but quickly ran into import/require nonsense, and want to spend some time tomorrow figuring out how to properly deal with having libraries that use both. For what it's worth, esbuild
seems to have been able to deal with both at once, and I've read that deno
and bun
can also deal with it, so it might be a node
thing.
- Wrote a chrome extension to skip past the stupid Zoom popups asking to open in desktop, and take you directly to the browser zoom website, when you open a Zoom link. I submitted it to the chrome extensions store, but it's pending review for now. Hopefully I can present on it at some point, since it was fun to implement and is genuinely useful.
- Wrote a nix
flake
for my system with nixosConfigurations
and homeConfigurations
that are separate, as opposed to using home manager as a nix module. Here is an example flake that uses it as a module and here is one that uses it as a flake to see the difference.
- Learned about cookiecutter and wrote these project templates for
python3
, typescript
, and java
. Cookiecutter is a super cool tool that lets you define a project template by actually setting up a project with a file hierarchy, but using {{ cookiecutter.field }}
anywhere in the template project (including file names and within files!), along with full jinja
templating code, to do more advanced templating. It lets you specify fields that you can have interactively prompted for when creating a project, and can even register hooks to run for project set up. I also added nix
to all these cookiecutter templates I wrote -- learning and then using buildMavenPackage
for java
, buildNpmPackage
for node/npm, and poetry2nix
for python. It was annoying to learn the APIs for these but seems super powerful now that I know how to use them. i'm probably going to sign up to present on this for tool talk on Friday.
- Cleaned up and improved this Echo360 downloader utility for my needs. Echo360 is the lecture recording platform my University uses, which does not come with any way to download lectures. Under the hood it's just s3, though (so I'll be leaving them with a pretty big egress bill, probably, lol). Lectures have 3-4 streams, where there's the audio for each stream, along with a stream for the slideshow itself, which is a video, and the video of the lectuerer. My version is a bit cleaner and more safely typed than the original, is much more minimal, and uses
ffpmeg
to automatically merge together the streams into nice side-by-side mp4
videos.
Events --
- Joined today's movie night! Hacker 1995. Weirdly it got quite low reviews, but I really enjoyed it. If only systems hacking were as fun as the movie!
- Did a running event with @Elijah Reissman Kennedy (he) (S1'24) and @Seamus Edson (he) (S1'24). Also learned about an HTML energy event that I might attend.
- Signed up for AI Tinkerers prompt engineering competition! Planning as part of helping @Joseph Martinez (he) (S1'24) with mktute also practicing with improving prompting to get better tutorials.
- Did a board game night take 1! Was a ton of fun, did 7 Wonders, Tsuro, So Clover, and Coup. Was great to see so many people join, and to try @Isaac Rhett (he) (S1'24)'s spicy popcorn. I will also bring popcorn next time (but it will be a bit more generic)!
- Joined @Finn Boire (he) (S1'19) and a few RCers and a friend to attend the Twenty Sided Tavern, an interactive DND event where the audience gets to play along. It was a ton of fun.
- Paired with a few people on learning a bit about how
git
works and more advanced usages. Got to hear from @Jaseem Abid (he) (S1'24) on how git
objects work and sharding, which was super cool. I'm going to hopefully try to assemble a git
group soon.
Impossible day!
- I worked with @Divya (she) (S1'24) and @Jacob Zimmerman (he) (S1'24) on implementing Raft in python for use on raspberry PIs. We were able to draw out a state transition diagram and table, which we're using for the implementation. The idea behind Raft is that we can have a cluster of many distributed nodes, and the network holds a state, so if any node goes down, the state can still be accessed. What's cool about Raft is that there's a source of truth, the "leader" of the cluster, which all nodes get their information from. If the leader node goes down, then there's a complicated election process to decide on a new leader, along with reconciliation to decide which data to consider the most recent.
Stuff I want to do:
- Deploy an API for a mobile app I've been working on and learn how to do ssl with nginx (https). I would like to learn more nginx in general, and how to use it with docker too.
- Learn how to do nix docker base images.
- Write my own nix home manager module to learn how writing modules and
option
s work.
- Catch up on reading other peoples' checkins.
- Maybe start a DND campaign if there's interest, but I'll have to see about that.
- Continue working with @Divya (she) (S1'24) on implementing raft in python
- Set up an email signature (like, the thing that is appended to emails), that looks nice and professional. Maybe also learn how to use mutt email client.
2024-06-02
It's been a bit since my last checkin, and I want to try to keep more consistent going forward. Here's some things I've done...
- Configured neovim with an LSP, completion with CoC and github copilot, added a file tree and status bar, and set up a bunch of keybinds. I'm starting to use it as my main IDE and I'm beginning to like it. I really just wish that it was more reproducable and nixified -- this may be the next step I take.
- Figured out how to package things with Python! Paired with @Omar Jatoi (he) (SP2'24) to work on devshells and building with Python. I was going to go down a rabbit hole of janking
requirements.txt
to work for my needs by creating an ad-hoc venv for the build, but realized that this would be impure and require disabling the sandbox. I figured out that this previously was the solution, using pypi2nix, but that's now abandoned in favor of what seems to be poetry2nix. I got a DalleCLI and ChatGpt CLI working with nix
flakes
, both for devshells
and building! Poetry is an alternative python dependency and package manager that uses venv behind the scenes, but provides a really nice UX that includes a lockfile and proper version. Poetry2nix is a tool that "automagically" (their word!) scans the poetry lockfile and builds using those exact packages. To get the GPT CLI to work, I also had to deal with including a different external binary requirement, which I was able to get working by exporting LD_LIBRARY_PATH = "${pkgs.stdenv.cc.cc.lib}/lib";
(I had to find the export from nixpkgs from a forum post, but this makes sense). Now I have a terminal GPT and Dalle client!
- Started attending the Tools Talk meetings. Also had dinner with @Paolo Holinski (he) (SP2'24) and got to talk about ungoogled software and alternatives, scooter hacking, and a few other things, after attending his amazing Nix presentation (wherein I learned about nixeverywhere and
kexec
). Very excited to learn about overlays this week, try out nix docker containers, and maybe even nix VMs.
The next steps for me now are:
- Arrange a meeting to practice some git this week. Also maybe finish up the flexbox froggy pairing group I started last week, and do grid garden.
- Start a board game group! I'm going to kick off a topic in current batches to gauge interest later today.
- Do some leetcode and research internships. I'm a bit overdue and I really need to get started.
- Continue work on a react native project that I'm working on for someone. This is a closed source project that I'm doing for someone, so I don't really want to spend my RC time coding the project, but I do want to set up metro with react native on Nix. I've given up on android emulation on Nix for now (and got a physical android).
- Learn about
direnv
.
- Further configure
hyprland
.
- I want to learn about
special
(yes, that's the technical name) workspace
s, which are basically just workspaces that live outside the usual scroll through workspaces and are "scratchpad" workspaces.
- I need to set up mouse keybinds to drag around floating windows, and polish my existing keybinds a bit.
- Finish up configuring
waybar
to look nicer and include workspaces. I'm also considering setting up a workspace matrix for hyprland, and am considering forking workspacer, which is a neat Python utility that adds workspace previews.
- Make a utility to download my school's lecture recordings as mp4s using ffpmeg and some puppeteer (probably).
- Figure out why copying and pasting to system clipboard aren't working with neovim.
- Read everyone else's checkins!
2024-05-22
First day at the hub since last summer (okay, I did peep in during spring break to grab some board games I had left)! It's great to be back, to have espresso machine access again, and to be able to socialize with recursers in person. Tomorrow I will strategically not pack lunch so that I can hang out with other RC'rs to grab lunch! I will also try to locate an RC tshirt.
I did a lot of meeting-and-greeting today, followed by pairing with @Rylee Alanza Lyman (they) (S1'24) to configure neovim (which we started, but ended up pausing because of how much trouble configuring it with raw lua with home manager was giving me with nix). I still have a long way to go, but it was still fun to see how configurable and powerful neovim-configuring is. I'll probably table this until my nix setup is ready.
Then, I spent most of the rest of the day (and night) trying to get an Android emulator working on Nix for a React native app I've been working on. They say that android-studio
should work and is already prepackaged, but I haven't been able to get it to work. It looks like android studio was having trouble locating "libpng," and a friend told me about NixLD to help binaries locate things when they look in places they aren't supposed to look (that's my understanding). I need to learn more about flakes and figure out how to hack my way into getting an android emulator to work. I think I'm going to need to read up on the ELF file format.
2024-05-21
Today was a super long day, and I ended up doing a lot. Let's see...
- Started this morning working with @Charles Eckman (he) (SP2'24) and a few other current-batch RC'rs who joined in on Flexbox Froggy, a fun game-like website to help you learn the ins and outs of flex boxes. It was super interesting to discuss the implications of flexboxes in right-to-left languages. This included finally learning the differences between things like
space-between
, space-around
, space-evenly
, and more! Tomorrow I'm going to try to plan to finish the tutorials, and then move on to Grid Garden (a similar game for grids).
- Went to a formal methods/software foundations book club planning session. It seems really interesting, and I'm going to attempt a lesson/chapter this week and see if I'm interested.
- From tinkering I learned that in Vim you need to use \( and \) for the parenthesis for capture groups in
sed
s and then \<n> to access a specific captured element. Also, \r for new lines to plop in instead of \n, even though \n is what you use to find newlines.
- Hopped in a webdev group meeting. I had a ton of fun in a NextJs group during my last batch, and would love to stay involved in webdev since it's still probably my primary interest. I love typescript!
- Attended the pairing workshop. Last batch it was mastermind, but this time around it was the game of life. Ended up pairing with @Jonah Vairon (he) (S1'24) to work on a Python game of life implementation, which we then continued later on on. We learned about some super super cool terminal escape character combinations to allow us to do things like moving around the cursor, delete lines, and overwrite lines in the terminal. Here's the end result of what we worked on -- it is an animation in the terminal itself that updates in real time to display the game of life. We want to pair later this week to make a more general purpose library for terminal hackery and animations, and will probably give a Thursday presentation!
- Helped a friend list a ton of Warhammer figurine kits on ebay. One sold right away within hours!
- Had a coffee chat with @Oliver Clive-Griffin (SP2'24). Learned about UV , which basically seems like a pnpm for Python. It seems super super powerful and useful, so I will absolutely be fiddling with it.
As for continued progress with configuring my Nix system...
- I ported over my
VSCode
configurations to home-manager
, but still need to set up my extensions. I want to move over to vscodium
too (an open source de-microsoft-ed version of VSCode
.
- Setting up more keybinds for dealing with groups with hyprland. Groups are tabbed windows where you can have multiple windows nested within one window. I'm trying to replicate the shortcuts I'm used to with popos.
- (related) Paired with @John Isak Texas Falk (he) (W1'23) to give a brief tour of
hyprland
and also to figure out how to yoink windows out of tabbed groups. Turns out the dispatcher for this was moveoutofgroup
. Also turns out that there's no way to specify a direction to yoink it out by default. Will need to figure out a hacky solution. John also introduced me to TTY
s (control + alt + f<n>) to get to specific shells on my computer. I need to play around with this more -- I wonder if I can run multiple instances of wayland at once.
- Learned about [Sops](- https://github.com/Mic92/sops-nix) and Agenix for storing secrets in
Nix
configurations. Will set one of these up later this week or this weekend. If anyone wants to pair on this DM me!
- Figured out that I can use
import
instead of .imports
to import nix code directly instead of merging configs with the boilerplate of home-manager.users.wolf.programs.x.y...
; I can just import specific pieces of Nix
code. Will play with this more soon.
Now, on my TODO-s:
- Catch up on reading everyone's checkins
- Finish up organizing a running group for pre-checking runs by the hub
- Learn how
Nix Flakes
work so that I can get an unstable version of hyprland
working for better configuration.
- Fully configure
neovim
from scratch with lua
. Would love to pair on this if anyone's interested!
2024-05-20
Bad sleep deprivation caught up to me and I overslept a bit, but I got to join meet and greets and am really excited by the usual eclecticity (eclectic-ness?) of the batch! Judging from welcomes it seems like there's a lot of other people also interested in nix, and the other things I'm going to work on. I'm hoping to start a pre-checkin running group by the hub, and maybe even assemble a nix group shortly if there's people interested.
One of my goals this batch is to do daily checkins, every day, and then when the batch is done somehow put them on my website for reflection.
Today I mostly continued to get my laptop to a slightly more usable state. I'm in the process of configuring my OS from scratch with hyprland and NixOS (so I don't even have a full DE!). It's been a ton of fun, but literally everything needs to be configured.
Today, I made some next steps towards general usability...
- I got my audio keys working using
XF86Audio
keys from a Reddit post I found. I can even crank my volume above 100% this way!
Learning about XF86 "keyboard symbols" was neat. Basically they are the non-fn-key-held actions for the top row keys, like the brightness-up key.
binde =, XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.4 @DEFAULT_AUDIO_SINK@ 5%+ # -l means limit, since we don't want to go above 140%
binde =, XF86AudioLowerVolume, exec, wpctl set-volume -l 1.4 @DEFAULT_AUDIO_SINK@ 5%-
bind =, XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
It took me 30 minutes to figure out that the command after exec
CANNOT have quotes around it (it silently does not work)
2) Learned about wev
, a command line wayland keypress viewer that gives you information about the IDs of keys that get pressed.
3) Figured out how to use hyprland submaps
. Basically, I can have chords for keybinds, like SUPER + ENTER to enter a "resize" mode, where I can then use hijk
to scale the active window, and then ESCAPE to leave the mode. It's super neat.
I still have a lot of bugs to work out. Zulip desktop app doesn't launch, possibly because of an actual electron bug. Zulip terminal app does work, but I need to get used to it. Also, Zoom is super blurry, so I want to see if running a flatpak version will help. Once I finish getting my laptop to a more usable place I want to actually study the nix language more.
Oh, and one last thing: I have a Mac Mini that I'm going to set up a bluebubbles (imessage) server on this wee, at the hub. Basically, it will let me use imessage in the browser of a linux machine, and on android. If anyone's interested in pairing on that later this week at the hub (it involves hacky things to get around apple nonsense, like disabling disc protection), feel free to let me know!