15 votes

What programming/technical projects have you been working on?

This is a recurring post to discuss programming or other technical projects that we've been working on. Tell us about one of your recent projects, either at work or personal projects. What's interesting about it? Are you having trouble with anything?

29 comments

  1. [3]
    Apos
    Link
    I've been making MonoGame libraries for a few years now. They help me create games much faster. Built on the same API as MonoGame, there's now KNI that allows building games for the web. This week...

    I've been making MonoGame libraries for a few years now. They help me create games much faster.

    Built on the same API as MonoGame, there's now KNI that allows building games for the web. This week I ported all my libraries to KNI and they all worked on the first try. It's pretty cool to have all my games instantly work in a web browser.

    I'm participating in a local gamejam next week so it should be fun to toy with this tech. I can write one codebase and release games on many platforms. The current platforms that I have tested are Windows, macOS, Linux, Android, web.

    8 votes
    1. [2]
      jmpavlec
      Link Parent
      Looks neat! Do you have any examples you can share that are playable on the web?

      Looks neat! Do you have any examples you can share that are playable on the web?

      1. Apos
        Link Parent
        I mostly tested locally. Here is one I just uploaded: ProjectCore. It's an older game from a gamejam I did a while ago. The theme was "Change is good" so I made a tower defense game where you can...

        I mostly tested locally. Here is one I just uploaded: ProjectCore. It's an older game from a gamejam I did a while ago. The theme was "Change is good" so I made a tower defense game where you can move your towers and the paths also move. The towers have a reset mechanic when you move them which allows you to micro them so that they shoot faster.

        The controls might be a bit hard at first. You can right click to place towers down initially. To move them, you can left click on a tower, then left click somewhere else.

        There are 3 types of towers. You can switch the type of a tower by left clicking one and then using the keys 1, 2, 3.

        To go switch faster, you can instead use the columns of the keys. For the first tower, the keys are Q, A, Z. The second is W, S, X, etc.

        The game starts slightly slow and the difficulty ramps up as more and more paths are added.

        1 vote
  2. Lossara
    Link
    I'm trying to make a 3D chocolate printer out of a second hand 50€ Ender 3. I have the parts, designed the mechanical bits in CAD, printed them using the printer I'm going to cannibalise, and now...

    I'm trying to make a 3D chocolate printer out of a second hand 50€ Ender 3. I have the parts, designed the mechanical bits in CAD, printed them using the printer I'm going to cannibalise, and now I just need to wire everything up. Which is my problem. I can't program to save my life.

    The chocolate needs to be kept at 31°C before being printed to allow the chocolate to crisp up and retain the cocoa butter in its crystal (II) form and snap when cooled. So I have a heating pad and temperature probe to keep that at the correct temperature before being printed.

    For cleaning purposes, the nozzle must be a clamshell and the vat must be coated in a food safe epoxy. So rather than use a screw to push the chocolate and not have to recharge, I'll just be using a plunger that's propelled by a rack and pinion attached to a stepper motor. The stepper motor now works-ish. It's all controlled with an Arduino.

    The .gcode (instructions on where the head should go and how much filament to extrude) is inserted into the printer computer and stays there. Problem is, I don't know how to read the extrusion command. I assume that I can hijack the wire on the printer itself that commands the filament motor, upvolt it, and wire it straight into the stepper motor commands on the Arduino. I'm worried that the time delay for the Arduino to think would destroy the print, or require it to print so slowly I'd rather it not work at all.

    I can feel that the project is getting close to the end once I've figured that out, with "only" having to tweak the PIDs to properly finish it.

    7 votes
  3. Toric
    Link
    My Rust based window blinds controller for Home Assistant, Crabroll, just made its first MQTT-commanded movent! Ive been working on this since july. I had to write a stepper motor movement...

    My Rust based window blinds controller for Home Assistant, Crabroll, just made its first MQTT-commanded movent! Ive been working on this since july. I had to write a stepper motor movement planner, a driver for the TMC2209's UART interface, and wrote a short paper on an integer-only stepper motor movement algorithm in the process.

    But the end of the beginning is in sight. The only thing left to do on the software side is write home assistant YAML describing the MQTT schema, and writing build documenation on how to configure the build time constants. After that, I need to briefly take a detour and assemble my new voron trident 3d printer, and then I can start prototyping the mechanical parts.

    There are plenty of features Id love to add to Crabroll in the future, such as home assistant auto discovery, better build-time config (currently its a bunch of env vars, Id like to make it a simple TOML file), and splitting out the stepper motor library into its own project that others can easily use. But for now, Im happy with what Ive managed to do with this as it is.

    6 votes
  4. kari
    Link
    At work, I'm on the data plane team for a series of enterprise IPS appliances and me and a couple of other people have started research into implementing QUIC/HTTP/3 inspection via a MITM (this...

    At work, I'm on the data plane team for a series of enterprise IPS appliances and me and a couple of other people have started research into implementing QUIC/HTTP/3 inspection via a MITM (this would be inbound/server-side only, at least to start). So far, I've mostly just been reading the QUIC RFCs, but it's been interesting to learn about. I've known of QUIC for a while and have had it enable on my home server for at least a few months, but haven't known too much about the specifics before now.

    5 votes
  5. [5]
    devalexwhite
    Link
    I've been working on wiring HotSync conduits so I can load up my Palm Pilot with internet content for offline consuming. So far I have a Wordle conduit that syncs the latest puzzle ID, and scripts...

    I've been working on wiring HotSync conduits so I can load up my Palm Pilot with internet content for offline consuming. So far I have a Wordle conduit that syncs the latest puzzle ID, and scripts for pulling articles from RSS. Want to write a VersaMail deserializer and conduit so I can sync email and send from my Palm Pilot's outbox. Have a couple other ideas I eventually want to get to as well such as a crossword of the day, daily weather (paired with a custom app), Gemini articles, Sudoku of the day, Kagi News (with a custom app), etc.

    I love the idea of being connected in an offline, at your own pace, and this has been a great way for me to achieve that.

    5 votes
    1. [2]
      ShroudedScribe
      Link Parent
      This is really cool. I know how hard it can be to stick to the things you enjoy (wordle, etc) and not veer into those you don't always enjoy (social media) when using a smartphone at times you...

      This is really cool. I know how hard it can be to stick to the things you enjoy (wordle, etc) and not veer into those you don't always enjoy (social media) when using a smartphone at times you should be relaxing. It sounds like you've found a great way to do that.

      2 votes
      1. devalexwhite
        Link Parent
        Thanks! Yeah, I really feel like a modernized Palm Pilot device would really make a killing nowadays as people are getting more frustrated with how distracting smartphones are. A e-ink style...

        Thanks! Yeah, I really feel like a modernized Palm Pilot device would really make a killing nowadays as people are getting more frustrated with how distracting smartphones are. A e-ink style device with a month long battery and keyboard that syncs content with your computer every morning and has no WiFi/Cell/etc would rock

        Until then, Palm Pilots are awesome and pretty cheap on eBay.

        2 votes
    2. [2]
      ewintr
      Link Parent
      Kudos for making it happen. I have dreamed of such a device many times. I have acquired a small collection of PDAs like a Psion Series 5 and an Atari Portfolio with the idea that the limitations...

      I love the idea of being connected in an offline, at your own pace, and this has been a great way for me to achieve that.

      Kudos for making it happen. I have dreamed of such a device many times. I have acquired a small collection of PDAs like a Psion Series 5 and an Atari Portfolio with the idea that the limitations of those devices would provide a natural filter to only sync the basics. While at the same time scratching my retro computer itch, of course.

      But I never made any serious progress in actually using them. As it turns out, getting them connected to the modern world is not a trivial task. Your solution is for more realistic. Still hoping that one day I will get to it though.

      1. devalexwhite
        Link Parent
        Oh wow I'd love to have both of those in my collection, especially the Atari! My drawers are way too full of handhelds at this point though haha. I think Palm Pilots are right at that "modern...

        Oh wow I'd love to have both of those in my collection, especially the Atari! My drawers are way too full of handhelds at this point though haha.

        I think Palm Pilots are right at that "modern enough" point to still be useful. The screens are fairly bright, the OS is snappy, the battery life is good, interfacing with modern computers is still possible and there are tons of awesome apps.

        1 vote
  6. [3]
    ShroudedScribe
    Link
    I'm starting to seriously configure things in Home Assistant for the first time in over 5 years. A lot has changed, but a lot has remained the same. I just finished the backup implementation I've...

    I'm starting to seriously configure things in Home Assistant for the first time in over 5 years. A lot has changed, but a lot has remained the same.

    I just finished the backup implementation I've mentioned previously. The only thing remaining is updating Syncthing across devices from the horribly outdated version they're all on, but on my NAS' side of things, everything is configured.

    I'm also going to dip my toes into Grafana. I've been setting up Prometheus on applications that support it, as well as some of my backup tasks, and monitoring properly with a dashboard would be nice.

    3 votes
    1. [2]
      0x29A
      Link Parent
      That reminds me, I finally looked into how to do some easy trigger stuff in Home Assistant because my lights would always unsync / lose status after the power blinked out and I'd have to manually...

      That reminds me, I finally looked into how to do some easy trigger stuff in Home Assistant because my lights would always unsync / lose status after the power blinked out and I'd have to manually dig through menus to resync. Set up a script to wait a couple of minutes after HA starts and then resync the devices and it worked like a charm! While I keep my "smart" home surface area very minimal, I do enjoy HA and the ability to customize and do all sorts of triggering/etc. Plus everything is SO much faster and more reliable when the cloud isn't involved. Switching to HA from Google Home / Alexa was the best decision

      1 vote
      1. ShroudedScribe
        Link Parent
        I installed z-wave light switches in most of my previous house. It was awesome to schedule them, turn them on/off with voice commands, even control fan speeds and the evaporative cooler I had...

        I installed z-wave light switches in most of my previous house. It was awesome to schedule them, turn them on/off with voice commands, even control fan speeds and the evaporative cooler I had hooked up to a switch-connected plug with an outside lightbulb socket adapter. (Yes it was jank and I loved it.)

        These days I feel like it's more about "correcting" other devices that just have bad interfaces or default behavior. My TV doesn't handle CEC properly so I'm going to do something to figure that one out at some point.

        2 votes
  7. dsh
    Link
    Yii3 finally launched and I've been going through the documentation and playing around with it a bit. I have been doing a lot of pet projects with a Slim/Twig/PHP-DI/Custom Domain Code set up and...

    Yii3 finally launched and I've been going through the documentation and playing around with it a bit. I have been doing a lot of pet projects with a Slim/Twig/PHP-DI/Custom Domain Code set up and I am finding that the new Yii3 patterns are very similar to what I was bootstrapping myself. As with all these frameworks, there is a lot of overhead to learn but I think I really like the concepts that the Yii team has come up with for the framework. I am going to work on a simple application that will help me organize my contract audio work - Clients, Quotes, Jobs, Invoices, etc.

    Along with that, I was recently introduced to the bhvr stack for JavaScript/TypeScript and I have been curious about doing something with that.

    2 votes
  8. 0x29A
    Link
    To continue my 3D printing journey I have been trying to learn more about ways to get more comfortable with the FreeCAD way of 3D designing things since it has a steeper learning curve than other...

    To continue my 3D printing journey I have been trying to learn more about ways to get more comfortable with the FreeCAD way of 3D designing things since it has a steeper learning curve than other software

    The 3D CAD software market is pretty messy and with a lot of licensing models I do not like and companies I don't necessarily want to support, and FreeCAD is quite powerful if I can get comfortable enough with it, and then I'd no longer have any worries about licensing, even if I somehow was able to create a business out of 3D printing. It would just be nice to be free of any of those worries (similar to how switching to Linux has been liberating)

    The only downside I see is that doing quick designs does take longer, or at least, the workflow is so different than something like Fusion or Tinkercad. However, after watching some videos I feel like one can get fast at FreeCAD, and the power available (especially for free) is actually incredible.

    For anyone interested, and not used to FreeCAD or have struggled with it in the past after using other tools, I highly recommend Brodie Fairhall's videos which are a bit outdated (so things are better/easier in FreeCAD than even shown here) however, the superpower these videos had was making me feel empowered to use FreeCAD. It demystified a lot for me. I particularly recommend the "Fusion360 to FreeCAD" videos as a starting place.

    2 votes
  9. Carrow
    Link
    I've been going through that Godot course on Zenva from humble bundle. I've got several mini projects and a couple games with 2 brief levels. I have added my own touches along the way. Like the...

    I've been going through that Godot course on Zenva from humble bundle. I've got several mini projects and a couple games with 2 brief levels. I have added my own touches along the way. Like the RTS game, the course just implemented the AI targeting the nearest player unit. I added an aggro system that can allow enemies to gauge targets by HP too, flip the sign so they can seek the farthest enemy in range and/or healthiest enemy in range, and they can be tweaked for different enemies to give them different behaviors.

    Also been learning sprite art. I still like my first set best, carabineers and recolors. Did a battery and a pair of itty bitty guys too. Tried a ball but lighting was hard. Started in earnest on characters with Ms Dusa, but went too big and detailed, need more practice on smaller less detailed characters. Did a couple basic coins but they were quick and pretty whatever.

    2 votes
  10. [3]
    Weldawadyathink
    Link
    With planet scale announcing they have $5/month Postgres databases, I am moving audiobookcovers to planet scale. In many ways this is a downgrade; my current setup uses the oracle ampere free...

    With planet scale announcing they have $5/month Postgres databases, I am moving audiobookcovers to planet scale. In many ways this is a downgrade; my current setup uses the oracle ampere free tier, so 4 arm cores and 200gb data. But I have learned that I really don’t want to admin a database. Audiobookcovers went down for like a week last fall (hey, I was very busy) because of a database issue. My pgbouncer had a certificate from letsencrypt, and I had set up auto renewal, but it still somehow expired. Turns out that pgbouncer doesn’t automatically load a new cert file from disk. I had to set certbot to kill and restart pgbouncer. It’s those little things that I just don’t want to deal with. I did a ton of research to make sure I set it up perfectly, and it still broke. I just want it to work, and I’ll throw some cash at planetscale to make it happen.

    This causes me some headache with my dev/prod database setup. On my own server, I could set it up as its own database on the same Postgres server. Planetscale doesn’t support multiple databases, at least not without paying per database. So I am refactoring my setup to use different schemas for dev and prod instead of different databases.

    I was using flyway for migrations. It was functional, but I didn’t really like it. I just had to try to get it working again, but I decided it was more work than it’s worth. So I did some research into other systems. I found pgschema, which seems really cool. Instead of maintaining and running a series of migrations, you just maintain a single sql file that describes your desired database state. It compares the schema to the desired state, and makes the minimal modifications to get to that state. It seems really well done, and can work with the same file against multiple schemas, so it is perfect for my use case.

    2 votes
    1. [2]
      jmpavlec
      (edited )
      Link Parent
      How were you managing the db before with Oracle? Like a directly installed service or docker? I've been running postgres myself (with Docker) for my own prod app with no cert issues. Upgrades have...

      How were you managing the db before with Oracle? Like a directly installed service or docker? I've been running postgres myself (with Docker) for my own prod app with no cert issues. Upgrades have been smooth. Backups are fairly straightforward.

      I don't use pgbouncer so I guess that is the difference in the setup. I'm using a Java backend and Hikari for connection pooling.

      1. Weldawadyathink
        Link Parent
        Previously I was using supabase free tier. I also experimented with neon for a bit. Both are managed services. I fully expect that I could make it work if I wanted to, and I have for the past 6...

        Previously I was using supabase free tier. I also experimented with neon for a bit. Both are managed services. I fully expect that I could make it work if I wanted to, and I have for the past 6 months, but now I want it to just work. And now I don’t have to manage things like point in time recovery.

  11. xk3
    Link
    I've been playing around a bit more with tmux and wrote a couple small fish functions that let's me run multiple programs on different windows and wait for them to finish similar to GNU Parallel...

    I've been playing around a bit more with tmux and wrote a couple small fish functions that let's me run multiple programs on different windows and wait for them to finish similar to GNU Parallel but just for tmux:

    function args.or.stdin
        if count $argv >/dev/null
            printf "%s\n" $argv
        else
            cat
        end
    end
    

    This lets me use arguments or stdin to provide commands to run.

    function tmux.waitgroup
        set -l session_id (random)
        set -l signals
    
        args.or.stdin $argv | while read -l cmd
            set -l sig "sig_$session_id"_(random)
            set -a signals $sig
            # The window runs the command, then signals it is done
            tmux new-window "$cmd; tmux wait-for -S $sig"
        end
    
        for sig in $signals
            tmux wait-for $sig
        end
    end
    

    And it works pretty well... tmux.waitgroup 'sleep 2' 'sleep 5' will open two tabs in tmux, one will sleep for 2 seconds and the other will sleep for 5 seconds. They close when they are done and the window that ran the tmux.waitgroup will block until all the windows/processes are done.

    It works well for long running processes that you want to keep an eye on. Like I'm using it to run a script on each subfolder of a disk:

    printf 'lb shrink -vy %s --move ../processed/ --move-broken ../processed-broken/ --delete-unplayable\n' (fd -td --exact-depth=1 . $argv | grep -Ev '/lost\+found/|/processed/|/processed-broken/|/downloading/|/seeding/') | tmux.waitgroup
    
    2 votes
  12. [4]
    skybrian
    (edited )
    Link
    I am sorry but I've somehow been turned into a superfan of exe.dev, Shelley (their coding agent), and Claude Opus 4.5. I'm going to gush a bit. After dabbling with running Claude Code in a...

    I am sorry but I've somehow been turned into a superfan of exe.dev, Shelley (their coding agent), and Claude Opus 4.5. I'm going to gush a bit.

    After dabbling with running Claude Code in a devcontainer on my laptop, I decided I'd rather have my coding agent in the cloud. Here's a blog post about my setup.

    Coding with AI feels absurdly productive, but some of that could be an illusion because the denominator (time spent) is large. This is more fun than a lot of video games I've played; there is a lot of "just one more turn" going on and the hours go by quickly. I browse the Internet after giving Shelley something to do, but I'm still doing it less, which seems like a good thing.

    The first VM I created using exe.dev now has an uptime of 16 days. Time flies! It's just a dumb little link-sharing website, like a personal Hacker News. I asked Shelley to generate it because it was the first thing I thought of, just to try it out; I didn't even plan to use it. After that I mostly ignored for a while, but I had some links I wanted to keep handy and not post on Tildes (yet), so I saved them there. Then I wanted to close a few browser tabs with long articles that I hadn't finished reading yet, so I asked Shelley to create an unread section to save those. (Private because I don't want to recommend anything unread.) Today I thought maybe my saved links should have tags. So I came up with a short list of tags and asked Shelley to classify the links (all 15 of them) and add the UI for filtering and editing them. It just goes on and on; I have a bunch of features that I could decide to add and it would be easy.

    If you're worried about code quality, you can work on that too. It's up to you. In my other VM I'm working on a Chrome extension, and it has 256 tests currently (I asked Shelley to count). Some of them are property tests written using repeat-test, the library I stopped working on about a year ago. I don't know what the code coverage is but at some point I'll ask Shelley to implement a command to compute it and we'll work together on driving it up. One of these days I should ask Shelley to write some unit tests for skybrian-links as well; currently it has none.

    There are two developers I know of at exe.dev (maybe more, but I haven't met them). They seemed to like my blog post (since I said nice things about exe.dev) and followed me back. I posted feedback in the Discord and they're quite responsive. They open sourced Shelley a couple days ago and I might fix a bug or two, since it will be a lot easier with Shelley's help. As relationships with Internet service providers go, it's pretty sweet.

    Today I saw an error at the end of one of the conversations I had with Shelley. Reloading the page didn't fix it, so it was frozen. I started writing a bug, but then I thought, "Shelley can do this." So I started another conversation, posted in the error message and asked it to write a bug report. It did an investigation, which it could do easily enough because Shelley's conversations are just stored in a local Sqlite database in the same VM it has full access to. It wrote a great bug report, figured out the SQL command to run to fix it locally, then offered to fix the stuck conversation. I said 'yes' so it did.

    I assume that if I bothered to clone Shelley's repo, it could fix the bug too, and I could run the fixed version, and I could ask Shelley for any other features I want. This is a practical form of the free software ideal - user enpowerment like the Free Software Foundation wanted everyone to have, but in practice is only limited to programmers, and most of the time we don't fix the software we use even if we could in principle, because it's very complicated to fix and who has the time?

    Claude Code is closed source. They're very popular, but they don't have this.

    2 votes
    1. [3]
      Zorind
      Link Parent
      With this setup, is Shelley basically a wrapper for whatever LLM you tell it to use, and you provide your own access key for that LLM? I might actually have to poke around with it at some point....

      With this setup, is Shelley basically a wrapper for whatever LLM you tell it to use, and you provide your own access key for that LLM?

      I might actually have to poke around with it at some point. I’ve been hesitant to try out anything other than VSCode’s tab-autocomplete LLM, but I know that my work is probably going to start wanting us to use more agentic LLM-focused workflows at some point. And I’m struggling to figure out what a good learning resource for that would be. It seems like exe.dev / Shelley might be a good way to try it out in a fairly risk-free way?

      1. [2]
        skybrian
        Link Parent
        Yep, it's a wrapper. UI is bare-bones but it has what I need. There's a pulldown where you choose which LLM you want to use. I haven't changed it away from the default, Claude Opus 4.5, and it's...

        Yep, it's a wrapper. UI is bare-bones but it has what I need. There's a pulldown where you choose which LLM you want to use. I haven't changed it away from the default, Claude Opus 4.5, and it's using their API key, installed when you create the VM.

        My understanding is that when they have billing working, they will be including some AI usage with the subscription. For now, it's free and apparently unlimited. I shudder to think of what their bills must be, but supposedly they're keeping an eye on it. It can't last.

        I assume you'll be able to use your own API key.

        1 vote
        1. post_below
          Link Parent
          Wow. That could easily cost them a couple thousand a month per user. @zorind Opus 4.5 (on someone else's dime) is probably the best way to try out ai coding agents, don't think twice. Hordes of...

          Wow. That could easily cost them a couple thousand a month per user. @zorind Opus 4.5 (on someone else's dime) is probably the best way to try out ai coding agents, don't think twice. Hordes of aspiring vibe coders are searching for exactly this kind of access to frontier models as we speak, presumably word will get out and they'll have to stop doing it before too long.

          Edit: removed the popular search term so I'm not speeding up the demise.

          2 votes
  13. [3]
    CrypticCuriosity629
    Link
    So after watching Benn Jordan's video on Gadgets For People Who Don't Trust The Government, I was captivated with the idea of an IMSI Catcher Catcher. However as opposed to being a personal...

    So after watching Benn Jordan's video on Gadgets For People Who Don't Trust The Government, I was captivated with the idea of an IMSI Catcher Catcher.

    However as opposed to being a personal device, I have been thinking all weekend about making it into something that can be brought to a protest and warn everyone around you.

    Currently going over the code for RayHunter and ideating how to hook an LED controller up to one of these old hotspots and get Rayhunter to expose the status code to change the LEDs reliably.

    Also hooking a button or timer to refresh at certain intervals.

    The idea is to create something you can bring to a protest to warn others around you of an IMSI attack.

    I'm trying to think of a politically relevant design too, my first idea is like a wizard staff with the Crystal being lit up a certain color based on the status of the IMSI catcher catcher.

    And then have a sign explaining what it is and what it means.

    2 votes
    1. [2]
      lynxy
      Link Parent
      It's a real neato idea, but I must admit- the simplest solution to this problem appears to be to just not bring a phone to a protest for which you might be retaliated against. Even if your device...

      It's a real neato idea, but I must admit- the simplest solution to this problem appears to be to just not bring a phone to a protest for which you might be retaliated against. Even if your device notices that you're being MITM'd, surely it would be too late for most people?

      1 vote
      1. CrypticCuriosity629
        Link Parent
        Yeah, that typically is the best solution, but people bring their cell phones anyways so this would at least help raise awareness. Sure, if someone brings their phone to a protest with IMSI...

        Yeah, that typically is the best solution, but people bring their cell phones anyways so this would at least help raise awareness.

        Sure, if someone brings their phone to a protest with IMSI tracking, the attackers would know they were there and when they showed up. But if they turn off their phone after seeing something like this, the attackers won't know when they left or how long they stayed, just when they turned their phone off.

        So not perfect, but better than nothing. Hopefully it gives a visual example not to bring phones to places like that.

        And frankly I like the idea that it reveals what tools are being used and when and makes it known. Lifts the veil a bit.

        Maybe even looking into disposable faraday cage bags to hand out.

        Was also thinking about doing some meshtastic outreach too while I'm at it, so educating people on meshtastic for protests.

        3 votes
  14. text_garden
    Link
    I extracted the audio of all episodes of Star Trek: TNG. I'd realized two things: TNG is very audio-only friendly and I know it well enough that I can usually fill in the blanks where it isn't....

    I extracted the audio of all episodes of Star Trek: TNG. I'd realized two things: TNG is very audio-only friendly and I know it well enough that I can usually fill in the blanks where it isn't.

    From my source video files, this turned out to be ~11 GB of ~150-200 kbit/s AAC. Sadly, this would not fit on my phone along with the music I have there. I ended up reading about Opus which seemed ideal for this use case. I did an initial test at 48 kbit/s VBR and was impressed with the performance. I re-encoded all of it overnight, getting 2.7G of Opus files. All the dialog is clear and legible, there are no overt artifacts in the background sounds and sound effects. The only place I really noticed a slight degradation was in the theme song, though I imagine the problem is similar for other full arrangements of music.

    I also experimented a bit with WebAssembly and browser Worklets. It was very easy to build a WebAssembly module using Zig. It can then be built in the main Javascript thread in the browser, but the worklet has to instantiate it. In my case, I created an AudioWorklet that calls into the WebAssembly module to fill the buffer. I started with a basic sine wave tone generator but then combined a few libraries I've made to play back a piano MIDI file using a simple synth. I'd like to experiment with passing messages between the main thread and the worklet thread next, to possibly control the synthesis parameters.

    Finally I added support for multiple projects in Pocket Acid, my software groovebox. Previously, everything about it was contained in one file which was limited to 256 pattern arrangement steps. I though this would be enough for a while but a friend who has been using it a lot let me know that he was running out. Now I've added a screen where you can select one out of 256 such projects arranged in a 16x16 grid. I mostly use this spatial grid representation to avoid text input, which I personally think is rarely fun with a gamepad.