{
  "path": "/a/3mi3hicjyyd23-what-ive-been-up-to",
  "site": "at://did:plc:gijpvbkdbr56kazbdjhfvb3d/site.standard.publication/3mi2fpvnluk2b",
  "$type": "site.standard.document",
  "title": "What I've been up to",
  "content": {
    "$type": "app.offprint.content",
    "items": [
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 118,
              "byteStart": 110
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "It's been a while since my latest post. I've done quite a bunch of things over these past 3 months, which can probably explain the absence of posts here."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "Anyway, let's go over what happened in January and February."
      },
      {
        "$type": "app.offprint.block.heading",
        "level": 2,
        "plaintext": "Fixed bugs and improved feature-parity in Stoat"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "Stoat is a free and open-source communications platform built in Rust and Typescript + Solid.js."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "In January, I shipped three feature-parity features to continue bridging the gap between the legacy web app (which is going to be phased out sooner or later) and the new web app. These include:"
      },
      {
        "$type": "app.offprint.block.bulletList",
        "children": [
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "You can now customize your accent colour by changing it to whatever colour you prefer. One caveat however is that the app will find the closest accessible colour to it, which is a by-product of the library Stoat uses for it's material you colour-scheme."
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "Server operators can now set where system messages go through the server's settings, matching the behaviour present in the legacy app."
            }
          },
          {
            "content": {
              "$type": "app.offprint.block.text",
              "plaintext": "Animated profile pictures now animate when hovering over a message."
            }
          }
        ]
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "I've also fixed a bunch of miscellaneous bugs, such as being able to access a server's settings panel without having permissions to do so, or the message composer not using the user's emoji pack preference."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "In February, I prioritized bug fixes over feature requests so that the app can feel more \"stable\". Such as being able to react to messages with unicode emoji, browsers not auto-completing emails on the login screen, and not being able to remove friends from the user card."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "In march, I briefly went back to feature requests and added the ability to rename categories and restored the \"Delete bot\" functionality, which was weirdly removed at some point."
      },
      {
        "$type": "app.offprint.block.heading",
        "level": 2,
        "plaintext": "Started taking notes using Emacs Denote"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "I do not have a habit of taking notes of important things that I need to remember, so last year I set out to find the best way to take notes."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "Eventually, that search concluded and I landed on Emacs' marvellous Org mode, which is a text format akin to markdown that deeply integrates with Emacs and includes several note-taking and task/habit tracking facilities, such as Org Agenda and Babel."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "However, I could not find a robust way to link and organize said notes. Briefly tried Org Roam but it was too inflexible and did not feel like I was productive using it. It's the most similar to Obsidian, sure; But it should not need it's own database to manage links, specially when said database can be the same notes folder I have!"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "Denote is a different approach to the Zettelkasten method, where notes are named using a simple to parse format, have identifiers based on the date and time of creation, and can have keywords or \"tags\" to quickly classify them. It's also similar to what you would see with Obsidian or Org Roam, but unlike Roam, it does not depend on a external database and uses the notes folder as the source of truth, which means that not only can you organize and tag notes but you can also tag documents, images, and more!"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "It's extremely flexible and extensible, which is something that I was very glad about when I was first learning about Emacs. It sometimes feels like denote is a part of core Emacs, when, in reality, it isn't!"
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 44,
              "byteStart": 27
            },
            "features": [
              {
                "uri": "https://protesilaos.com/",
                "$type": "app.offprint.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "I would recommend visiting Protesilaos' blog, it's always a treat when he publishes something new on his code blog. "
      },
      {
        "$type": "app.offprint.block.heading",
        "level": 2,
        "plaintext": "Rewrote my website's \"fallback\" script in Common Lisp "
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "My website, which is meant to serve as a little landing page explaining what I like and what I've done so far, contains a section where I list the 5 most recent blog posts from all across the atmosphere."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 220,
              "byteStart": 214
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#underline"
              }
            ]
          }
        ],
        "plaintext": "The feature originally required the use of JavaScript, which was not ideal, as I am sure that some folks would prefer not having to run scripts on websites at all, specially if the website's content is meant to be static, which I understand."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "So I originally wrote a little HTML generator using Emacs Lisp that fetched the latests posts from my PDS, built HTML elements based on the entry's metadata, and wrote to the index page seamlessly."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "At first glance, it seemed like the right approach, since most of the site's updates are done manually and without a content management system. But I would later realize that it might have not been the right approach, because then the script would require the runner to have Emacs installed, which is, in my opinion, a pretty hefty piece of software. And if I would want to run this inside a CI container on, let's say, GitHub, I would need to cut down the time it takes to run those jobs so that my other projects can also run CI without microsoft charging me."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "So, in the span of a week, I rewrote the script in ANSI Common Lisp. Which was great!"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "It served as some well needed practice because I am not a good lisper by any means. Most of the rewrite went swimmingly, however writing to a section of a file was the most annoying part, but that was because I was trying to both read and write to the file, which was the wrong approach."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "Later, I realized this and the script worked like a charm."
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 52,
              "byteStart": 46
            },
            "features": [
              {
                "uri": "https://github.com/amycatgirl/amycatgirl.github.io",
                "$type": "app.offprint.richtext.facet#link"
              }
            ]
          },
          {
            "index": {
              "byteEnd": 67,
              "byteStart": 60
            },
            "features": [
              {
                "uri": "https://tangled.org/amybunny.tgirl.gay/website/tree/refactor%2Fcl-fallback-gen",
                "$type": "app.offprint.richtext.facet#link"
              }
            ]
          }
        ],
        "plaintext": "My website's source code is available on both GitHub and on Tangled, if you want to read through the code I wrote. Note that I have not completely tested this so it hasn't been merged to the main branch, I also have to hook this up to either GitHub CI or to a CRON job on my laptop."
      },
      {
        "$type": "app.offprint.block.heading",
        "level": 2,
        "plaintext": "Took classes about Angular"
      },
      {
        "$type": "app.offprint.block.text",
        "facets": [
          {
            "index": {
              "byteEnd": 26,
              "byteStart": 17
            },
            "features": [
              {
                "$type": "app.offprint.richtext.facet#italic"
              }
            ]
          }
        ],
        "plaintext": "As part of doing something while I waited for my university to respond to my application, I took some Angular classes that the University was giving as part of a programme called \"Continuous Education\", which consists of classes every saturday afternoon for 3 months."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "These classes were a bit disappointing since I came to the classes with the idea that I would like Angular, you know, with a positive attitude and all. I really wanted to like Angular but it seemed like a somewhat under-baked framework that tries to do a lot of things at once and not doing any of them particularly well."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "I can see it being a delight for enterprises and small businesses that need a robust framework to build their apps upon, but outside of that scope? ...eh, not really."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "The main gripe I had was the use of \"signals\" in a non-functional framework. Angular is composed of classes that you can inject into each other, and state is \"supposedly\" managed by the component, however, this was not the case and I ended up having to use signals, which felt weird and completely out of place in a MVVM (Model, View, ViewModel) project."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "Besides that, the classes were alright. The teacher thought us well, and I could understand the topics that were given to us, so all was not lost."
      },
      {
        "$type": "app.offprint.block.heading",
        "level": 2,
        "plaintext": "Bunny got accepted into university!"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "Yeah, not much to say about this one lol."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "Most of my excitement has faded away already, however I still can't believe that I got in, despite my awful grades back in high-school."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "The things that I've been doing for the past year or so have all been to try and organize my life, so that if I actually got in, I could handle the pressure of university assignments and classes. I've yet to see if they are going to pay off, however..."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "Only time will tell!"
      },
      {
        "$type": "app.offprint.block.horizontalRule"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "There are two more things that I could also list, but they aren't ready yet, so I think I'll leave them for next time I decide to write one of these."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "I am laughably bad at closing off blog posts or any kind of literary piece (my english teachers can all vouch for this), so excuse me if I don't say anything substantial here. I just don't like good things ending!"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "However, they all have to end at some point, otherwise they lose their charm."
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "What is not going to end, however, is my blog! It shall live forever!!!"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "Nah, I'm kidding, it will probably die once i forget about it again. At least I like writing these posts :)"
      },
      {
        "$type": "app.offprint.block.text",
        "plaintext": "- Amelia"
      }
    ]
  },
  "coverImage": {
    "$type": "blob",
    "ref": {
      "$link": "bafkreieejuwvgeqbtgxjcrru5elceto7hbw6k5kaw6ia4myni5v3azjdf4"
    },
    "mimeType": "image/jpeg",
    "size": 1610672
  },
  "description": "Things I did between January and March 2026",
  "publishedAt": "2026-03-28T13:28:40+00:00",
  "textContent": "It's been a while since my latest post. I've done quite a bunch of things over these past 3 months, which can probably explain the absence of posts here.\nAnyway, let's go over what happened in January and February.\nFixed bugs and improved feature-parity in Stoat\nStoat is a free and open-source communications platform built in Rust and Typescript + Solid.js.\nIn January, I shipped three feature-parity features to continue bridging the gap between the legacy web app (which is going to be phased out sooner or later) and the new web app. These include:\n- You can now customize your accent colour by changing it to whatever colour you prefer. One caveat however is that the app will find the closest accessible colour to it, which is a by-product of the library Stoat uses for it's material you colour-scheme.\n- Server operators can now set where system messages go through the server's settings, matching the behaviour present in the legacy app.\n- Animated profile pictures now animate when hovering over a message.\n\nI've also fixed a bunch of miscellaneous bugs, such as being able to access a server's settings panel without having permissions to do so, or the message composer not using the user's emoji pack preference.\nIn February, I prioritized bug fixes over feature requests so that the app can feel more \"stable\". Such as being able to react to messages with unicode emoji, browsers not auto-completing emails on the login screen, and not being able to remove friends from the user card.\nIn march, I briefly went back to feature requests and added the ability to rename categories and restored the \"Delete bot\" functionality, which was weirdly removed at some point.\nStarted taking notes using Emacs Denote\nI do not have a habit of taking notes of important things that I need to remember, so last year I set out to find the best way to take notes.\nEventually, that search concluded and I landed on Emacs' marvellous Org mode, which is a text format akin to markdown that deeply integrates with Emacs and includes several note-taking and task/habit tracking facilities, such as Org Agenda and Babel.\nHowever, I could not find a robust way to link and organize said notes. Briefly tried Org Roam but it was too inflexible and did not feel like I was productive using it. It's the most similar to Obsidian, sure; But it should not need it's own database to manage links, specially when said database can be the same notes folder I have!\nDenote is a different approach to the Zettelkasten method, where notes are named using a simple to parse format, have identifiers based on the date and time of creation, and can have keywords or \"tags\" to quickly classify them. It's also similar to what you would see with Obsidian or Org Roam, but unlike Roam, it does not depend on a external database and uses the notes folder as the source of truth, which means that not only can you organize and tag notes but you can also tag documents, images, and more!\nIt's extremely flexible and extensible, which is something that I was very glad about when I was first learning about Emacs. It sometimes feels like denote is a part of core Emacs, when, in reality, it isn't!\nI would recommend visiting Protesilaos' blog, it's always a treat when he publishes something new on his code blog. \nRewrote my website's \"fallback\" script in Common Lisp \nMy website, which is meant to serve as a little landing page explaining what I like and what I've done so far, contains a section where I list the 5 most recent blog posts from all across the atmosphere.\nThe feature originally required the use of JavaScript, which was not ideal, as I am sure that some folks would prefer not having to run scripts on websites at all, specially if the website's content is meant to be static, which I understand.\nSo I originally wrote a little HTML generator using Emacs Lisp that fetched the latests posts from my PDS, built HTML elements based on the entry's metadata, and wrote to the index page seamlessly.\nAt first glance, it seemed like the right approach, since most of the site's updates are done manually and without a content management system. But I would later realize that it might have not been the right approach, because then the script would require the runner to have Emacs installed, which is, in my opinion, a pretty hefty piece of software. And if I would want to run this inside a CI container on, let's say, GitHub, I would need to cut down the time it takes to run those jobs so that my other projects can also run CI without microsoft charging me.\nSo, in the span of a week, I rewrote the script in ANSI Common Lisp. Which was great!\nIt served as some well needed practice because I am not a good lisper by any means. Most of the rewrite went swimmingly, however writing to a section of a file was the most annoying part, but that was because I was trying to both read and write to the file, which was the wrong approach.\nLater, I realized this and the script worked like a charm.\nMy website's source code is available on both GitHub and on Tangled, if you want to read through the code I wrote. Note that I have not completely tested this so it hasn't been merged to the main branch, I also have to hook this up to either GitHub CI or to a CRON job on my laptop.\nTook classes about Angular\nAs part of doing something while I waited for my university to respond to my application, I took some Angular classes that the University was giving as part of a programme called \"Continuous Education\", which consists of classes every saturday afternoon for 3 months.\nThese classes were a bit disappointing since I came to the classes with the idea that I would like Angular, you know, with a positive attitude and all. I really wanted to like Angular but it seemed like a somewhat under-baked framework that tries to do a lot of things at once and not doing any of them particularly well.\nI can see it being a delight for enterprises and small businesses that need a robust framework to build their apps upon, but outside of that scope? ...eh, not really.\nThe main gripe I had was the use of \"signals\" in a non-functional framework. Angular is composed of classes that you can inject into each other, and state is \"supposedly\" managed by the component, however, this was not the case and I ended up having to use signals, which felt weird and completely out of place in a MVVM (Model, View, ViewModel) project.\nBesides that, the classes were alright. The teacher thought us well, and I could understand the topics that were given to us, so all was not lost.\nBunny got accepted into university!\nYeah, not much to say about this one lol.\nMost of my excitement has faded away already, however I still can't believe that I got in, despite my awful grades back in high-school.\nThe things that I've been doing for the past year or so have all been to try and organize my life, so that if I actually got in, I could handle the pressure of university assignments and classes. I've yet to see if they are going to pay off, however...\nOnly time will tell!\n\n---\nThere are two more things that I could also list, but they aren't ready yet, so I think I'll leave them for next time I decide to write one of these.\nI am laughably bad at closing off blog posts or any kind of literary piece (my english teachers can all vouch for this), so excuse me if I don't say anything substantial here. I just don't like good things ending!\nHowever, they all have to end at some point, otherwise they lose their charm.\nWhat is not going to end, however, is my blog! It shall live forever!!!\nNah, I'm kidding, it will probably die once i forget about it again. At least I like writing these posts :)\n- Amelia"
}