Sign in

Jacob Asper

@jacobasper.com
841 followers 211 following 650 posts

Rust is a must Cheese is scrumptious #100Devs he/they jacobasper.com

PostsRepliesMedia
Jacob Asper @jacobasper.com · 25/09/2026
As for angular highlighting, glad to make a PR if you’re interested There’s a good opportunity to do better than shiki for angular. Shiki does not syntax highlighting quite a lot. Here is a cherry picked example where shiki doesn’t apply highlighting on templates
Angular code syntax highlighted side by side with shiki 

The shiki side is mostly unhighlighted, whereas the twinkleplop side highlights templates and properly
210
Jacob Asper @jacobasper.com · 25/09/2026
Me overthinking
User asks chatbot what’s 5+5

Chat starts reasoning about the general concepts of literature, pyschology, philosophy and so on
240
Jacob Asper @jacobasper.com · 13/07/2026
I bought a knoll generation and that’s part of the selling point for me. It’s very bendy in the seat and back
Various people sitting in different positions in knoll generation office chairs

Some are leaning back, some are sitting backwards, some are leaning sideways. Some are sitting up straight
100
Jacob Asper @jacobasper.com · 12/07/2026
Via this alt text button
Discord image with an alt text button in the bottom left corner
120
Jacob Asper @jacobasper.com · 12/07/2026
Mobile at least has some option to see it all, I’ll check desktop
Around 500 characters of alt text showing in a popover on discord mobile
130
Jacob Asper @jacobasper.com · 01/06/2026
I have a terrible predicament. My WiFi password is 64 characters My new robot vacuum only supports 63 characters 😭
Only support 63-bit passwords
100
Jacob Asper @jacobasper.com · 24/04/2026
I've enjoyed writing about formatter performance recently. Here's a nice introduction into formatters including amazing art and architecture decisions I've made with JJPWRGEM! jacobasper.com/blog/...
A stick figure scheming to do something scandelous
040
Jacob Asper @jacobasper.com · 20/04/2026
Making some amazing images for an upcoming blog on JSON formatting performance!
	A sad CPU saying "I can only read one token at a time this is so sad. please
	make token 32 bytes or lower so I can read 2 at once"
030
Jacob Asper @jacobasper.com · 02/04/2026
I got the same correct. It seems like getting more right in a row gives you more points and opportunities for harder questions
FINAL SCORE
42/80
15/20 correct
REACHED: FORBIDDEN
Above average. Your CSS intuition is well-calibrated. Not perfect, but well-calibrated.
011
Jacob Asper @jacobasper.com · 14/03/2026
Is this a typo?
Highlighted text reading “HMRy”

vp dev : Uses Vite's fast dev experience with native ES modules and instant HMRy
000
Jacob Asper @jacobasper.com · 11/03/2026
Nice! I’m down to 76–80kg from 86kg and I feel so much better. The number doesn’t look that different but the difference is huge For me, it’s just eating less and walking more. I’d just eat stuff when I’m bored, and now I don’t think about food whenever. I still don’t eat super healthily to be fair
A weight tracking graph trending down from 86 kg in may 2025 to 76kg in march 2026
020
Jacob Asper @jacobasper.com · 09/03/2026
I am thoroughly impressed how solid the colors are. Ours turned out kinda blotchy How many layers of paint did you do?
A plate and mug with the pot of greed on them. The colors are blotchy, especially around finer details
130
Jacob Asper @jacobasper.com · 24/02/2026
Made an assembly stepper! I got annoyed at how large video files are, so built a web version. I'm probably going to skip the video bit and just make an interactive blog It will look less gross soon I promise
assembly code with a highlight showing the current instruction and relevant registers and flags to the right
020
Jacob Asper @jacobasper.com · 22/02/2026
Got inspired to make some pretty code animations after seeing yet another nicely animated YouTube video
020
Jacob Asper @jacobasper.com · 19/02/2026
I have no clue how to read these graphs, could you give me a quick breakdown if you get the time? I tried clicking the bars and they just change color a bit. I may have missed the explanation
Results for use state. There is a green bar and a red bad underneath blue bars that say 47% and 51%
100
Jacob Asper @jacobasper.com · 18/02/2026
This is a CAT checkpoint. Show me the most recent cat image on your phone.
A black and white cat poking its head through a fence cautiously
170
Jacob Asper @jacobasper.com · 18/02/2026
I found an unrendered markdown link in the article
An unrendered markdown link in the article 

on [Node-API](https://nodejs.org/api/n-api.html)
000
Jacob Asper @jacobasper.com · 18/02/2026
Morbius meme with the following caption:

IT'S MORGIN TIME
(CONTINVOUCLY)
151
Jacob Asper @jacobasper.com · 29/01/2026
Also Cladue later down
I'll leave you with an egample of a prompt I might try next: asking Cladue for their opinion on what you should do. The next thing I'd do in this project is to switch back into planning mode and ask this:
000
Jacob Asper @jacobasper.com · 29/01/2026
I think there’s a missing word/typo It says “This is a tiny different”
say Goodbye, world and it is showing diff
that will make it say Goodbye, world!.
This
is a tiny different, but it is also important to
100
Jacob Asper @jacobasper.com · 25/01/2026
I have been endlessly frustrated by accusations of LLM usage every time I use em dashes on a public forum—enjoy a spicy rant and an extreme amount of em dashes! jacobasper.com/blog/...

LLMs don't own em dashes—I do

Em dashes: 39

Jan 25, 2026

Em dashes are the best punctuation mark—but unfortunately they have fallen from their former glory—usurped by a false narrative. Many people are so colored by their AI hatred that they cannot conceive of a world with em dash usage outside of ChatGPT

Now, don’t get me wrong—I love a good AI slop shaming as much as the next person—but this is a pyrrhic victory. Judge slop for sloppiness—is it not slop in itself to outsource your opinions based on a coincidence?
0131
Jacob Asper @jacobasper.com · 29/12/2025
Brr
Windy conditions will continue for the rest of the day.
Wind gusts up to 42 mph are making the temperature feel like -20°
140
Jacob Asper @jacobasper.com · 13/12/2025
I wouldn’t mind it if you could tone Liquid Glass down a bit. I have it off since I couldn’t read anything and now my keyboard looks like this :( I’d like something in the middle of Liquid Glass and ultra contrast but oh well
The keyboard has a solid black background with light grey keys
110
Jacob Asper @jacobasper.com · 08/12/2025
JJPWRGEM has a really cool new version command It also may have gotten slightly faster as of recent
jjpwrgem version command being run in a terminal

It shows version 0.3.0 and ascii art of an axoltl riding a skateboardA comparison of JSON parse and stringify throughput for the jjpwrgem library versions 0.1.0 to 0.3.0 using the canada.json file. The bar chart shows average parse throughput (blue) and stringify throughput (red) in MB/s, with stringify consistently outperforming parse, especially in versions 0.2.1, 0.2.2, and 0.3.0. The accompanying table provides exact throughput values, highlighting a significant increase in stringify performance in later versions, reaching up to 817.78 MB/s in version 0.3.0.
010
Jacob Asper @jacobasper.com · 06/12/2025
JJPWRGEM is released if you want to try it out! Excited for many bugs and features to come! Setup cargo-dist to automate releases. Precompiled binaries are available for most OSs and architectures and it can be installed via npm, shell, or powershell. github.com/20jasper/...
A cartoon illustration of an orange axolotl riding a blue skateboard, featured on the npm package page for 'jjpwrgem', a JSON parser with good error messages
050
Jacob Asper @jacobasper.com · 02/12/2025
Finally did some perf testing for my JSON parser! Took an existing benchmark with a 2MB file. I ended up increasing parsing throughput by 60% by heap allocating Diagnostic information Now it's fully compliant with RFC 8259! U escapes are properly validated
Bar chart comparing JSON Parse and Stringify throughput (MB/s) for two versions of 'jjpwrgem' (0.1.0 and 0.1.1) using the canada.json dataset.

The blue bars represent the average Parse throughput: 57 MB/s for version 0.1.0 and 91 MB/s for version 0.1.1.
The red bars represent the average Stringify throughput: 202 MB/s for version 0.1.0 and 199 MB/s for version 0.1.1.
The chart shows an improvement in Parse throughput from 0.1.0 to 0.1.1, while Stringify throughput remains nearly the same
140
Jacob Asper @jacobasper.com · 29/11/2025
My JSON parser now passes 10ish more conformance tests! - leading 0s are now errors - basic invalid escapes are errors Still will have to handle - general string diagnostics - invalid hex escapes - invalid multibyte escapes
error: expected escapable sequence, found `🦀`.
       valid escapes are `\"`, `\\`, `\/`, `\b`, `\f`, `\n`, `\r`, `\t` or `\uXXXX` (4 hex digits)
  ╭▸ stdin:1:3
  │
1 │ "\🦀"
  ╰╴  ━━
150
Jacob Asper @jacobasper.com · 15/11/2025
Added infrastructure for patches and context in my JSON parser - migrated to annotated-snippets for easier patch handling - added context and patches for simple cases - formatted stringified tokens There's a long way to go to include context and patches for everything, but it'll be a fun time!
error: expected key or closed curly brace, found no significant characters
  ╭▸ stdin:1:1
  │
1 │ {
  │ ━
  │ │
  │ Expected due to open curly brace
  ╰╴
help: consider closing the unclosed curly brace
  ╭╴
1 │ {}
  ╰╴ +
030
Jacob Asper @jacobasper.com · 15/11/2025
Copilot got a little confused. I asked it to open a PR to apply a simple solution it found to a build failure it caused, and what do you know? It opened a completely empty PR Time to shelve my usage of that feature for a long while ha
GitHub Screenshot of a PR with no changes made
000
Jacob Asper @jacobasper.com · 12/11/2025
Finally got around to some more json formatting activity! - error messaging proof of concept via codespan diagnostics - handle unexpected control characters - handles whitespace as per the spec
error: expected json value, found Some(ClosedCurlyBrace)
  ┌─ FizzBuzz.fun:3:11
  │
1 │ { "hello": null,
   │ - expected due to `{`
2 │             "goodbye":
3 │           }    
  │           ^ uh oh
060
Jacob Asper @jacobasper.com · 11/11/2025
You can also pattern match it!
card = "3C"

match card:
    case [value, 'C']:
        print(f"{value} of Clubs")
    case [value, 'H']:
        print(f"{value} of Hearts")
    case [value, 'D']:
        print(f"{value} of Diamonds")
    case [value, 'S']:
        print(f"{value} of Spades")
    case _:
        print("Invalid card format or suit")
110
Jacob Asper @jacobasper.com · 03/11/2025
Now my JSON formatter has prettification and generally configurable options! I handled - arbitrary nesting - better error messaging for unterminated values - extracted object parsing from top level state machine I am scared to handle proper string escaping 😅
#[test]
fn prettify_arbitrarily_nested() {
    let input = r#"
            {"rust": 
            {"rust": 
            {"rust": 
            {"rust": null
            }
            }
            }
            }   
        "#;
    let expected = r#"{
    "rust": {
        "rust": {
            "rust": {
                "rust": null
            }
        }
    }
}"#;

    assert_eq!(prettify_str(input).unwrap(), expected)
}
030
Jacob Asper @jacobasper.com · 02/11/2025
I made a quick JSON formatter tonight! Whenever I hear about syntax trees, I feel the need to build something related I handled primitives and objects with primitive values and shall handle some nesting soon!
    #[test]
    fn uglify_removes_whitespace_object() {
        let input = r#"      {


        "hello hi":                       
        
        
                     null



                     ,


                     "by": "hello"


    }    
        
            "#;
        let res = uglify_str(input).unwrap();
        // we aren't guaranteed a key order
        assert!(
            res == r#"{"hello hi":null,"by":"hello"}"#
                || res == r#"{"by":"hello","hello hi":null}"#
        );
    }
040
Jacob Asper @jacobasper.com · 02/11/2025
Ironically just got an ad for them. They are steak nuggets, and an absurd amount a that
Advertisement for Arby’s new steak nuggets
020
Jacob Asper @jacobasper.com · 31/10/2025
A snack tier list ranking various chips, crackers, cookies, and snack foods.
From top to bottom, the tiers are labeled:

“You dropped this... 👑” (Top Tier): Cheez-It, Club Crackers, Bugles, String Cheese, Rold Gold Pretzels, Premium Saltine Crackers, Goldfish, and Animal Crackers.

A – Really Good: Takis, Doritos Spicy Sweet Chili, Ruffles Cheddar & Sour Cream, Cheetos Crunchy, Ritz Crackers, Cheetos Puffs, and Munchies Snack Mix.

B – Good: Wheat Thins, Ruffles Original, Lay’s Classic, Pringles Original, Baked Lay’s, Planters Dry Roasted Peanuts, and Funyuns.

C – Average: Rice Krispies Treats, Teddy Grahams Honey, Smartfood Popcorn, Oreo Mini Packs, Veggie Straws, Lay’s Barbecue, Powdered Donettes, Doritos Nacho Cheese, Cracker Jack, Fritos, Austin Cheese Crackers, Fritos Chili Cheese, Tostitos Scoops, Whales, Sun Chips Original, Chex Mix Traditional, Chester’s Fries, and Hot Fries.

D – Bad: Welch’s Fruit Snacks, Triscuit Original, Nilla Wafers, and David Sunflower Seeds.

F – Really Bad: Lay’s Kettle Cooked Chips, Jack Link’s Beef Jerky, Nutty Buddy Bars, Famous Amos Cookies, Lay’s Sour Cream & Onion, Powdered Donuts, and Grandma’s Cookies.

Sickening (Bottom Tier): Girl Scout Samoas, Twinkies, Honey Buns, Swiss Rolls, Hostess Ding Dongs, Little Debbie Cosmic Brownies, Chips Ahoy Chewy, Tastykake Chocolate Cupcakes, Fig Newtons, and Little Debbie Zebra Cakes.
000
Jacob Asper @jacobasper.com · 06/08/2025
Have I peaked as a developer? My power is too great
Sorry, command-not-found has crashed! Please file a bug report at:
https://bugs.launchpad.net/command-not-found/+filebug
Please include the following information with the report:
000
Jacob Asper @jacobasper.com · 03/08/2025
The tracing crate is so beautiful. With just an instrument annotation, I can attach the video id if it exists to all the events for DB calls and HTTP requests throughout the life of my endpoint
#[instrument(skip(pool), fields(url, video_id = ?YTUrl::try_from(url.as_str())?.id()))]
async fn summarize(
	Query(SummaryParams { url }): Query<SummaryParams>,
	State(pool): State<PgPool>,
) -> Result<(StatusCode, Json<Value>)> {
000
Jacob Asper @jacobasper.com · 03/08/2025
This must be a new record for fixing CI! I ran postgres in tests and it only took 4 attempts to get everything to work!
GitHub Actions workflows. 3 are failed and one passed
010
Jacob Asper @jacobasper.com · 02/08/2025
I spent 30 minutes wondering why my records weren't being saved in the database 🙃 Hint: the syntax is all correct and the query runs fine
		sqlx::query!(
			"UPDATE videos SET summary = $1 WHERE video_id = $2",
			summary,
			url.id_string(),
		)
120
Jacob Asper @jacobasper.com · 11/07/2025
I missed "on" from Haskell in TypeScript and it was pretty straightforward to implement! Unfortunately both "fn" and "fn2" need passed at the same time for good inference, but I'm satisfied either way 😀
const len = ({length}: {length: number}) => length;
const compare = <T extends number | string>(a: T, z: T) => 
  a === z 
    ? 0 
    : a > z 
      ? 1 
      : -1;
const on = <T, U, V>(fn: (x: T, y: T) => U, fn2: (x: V) => T) => (x: V, y: V) => fn(fn2(x), fn2(y));

["hi", "slkdfjsldkfljsk", [10, 11]].sort(on(compare, len))
060
Jacob Asper @jacobasper.com · 22/04/2025
Nice article! It might even get me to reconsider buying this tapestry 😂
A tapestry with bubble from Barbie that reads, gaslight gatekeep girlboss
220
Jacob Asper @jacobasper.com · 22/04/2025
Worm
A reddish worm that’s light red and translucent by the tail and a deep brown by the head. It’s moving on a sidewalk with greenery around
070
Jacob Asper @jacobasper.com · 06/04/2025
Did a codewars in COBOL to see what all the fuss was about. I'm sure I could simplify this if I dug more into it My review after writing an extremely simple program is that it's odd by modern standards. It's interesting to have so much control over datatypes via pictures
       identification division.
       program-id. EVEN-OR-ODD.
       author.     Jacob Asper.
      
       data division.
       working-storage section.
       01 r           pic s9(8).
       01 q           pic s9(8).
       linkage section.
       01 num         pic s9(8).
       01 result      pic a(4).
      
       procedure division using num result.
          initialize result
          divide num by 2 giving r remainder q
          if q is equal to 0
          move "Even" to result
          else 
          move "Odd" to result
          goback.
       end program EVEN-OR-ODD.
030
Jacob Asper @jacobasper.com · 03/04/2025
Moo moo as a playable character is something I didn’t know I needed
A cow doing a wheelie a motorcycle on top of a powerline in Mario kart world trailer
180
Jacob Asper @jacobasper.com · 30/03/2025
It will never stop making me laugh when I hear "slurping" in programming contexts
 -- <your args> ........... to tell nodemon stop slurping arguments.
020
Jacob Asper @jacobasper.com · 25/03/2025
How do y'all feel about the chatbot integrations in firefox? On a first glance it was a little odd, but it's been very nice. Sometimes it gets confused about what page I'm on, but that's to be expected with experimental features right?
A wikipedia page on ARPANET. A paragraph is highlighted, and a context menu asking with several options to prompt mistral appears. For example, quiz me, summarize, and a text box to put anything A chat window with Le Chat Mistral is open with some context about the page. It has prompted to ask for a quiz question about the selected text
010
Jacob Asper @jacobasper.com · 21/03/2025
Cheesey Garlic bred time!
Garlic bread with cheese in a spiral pattern on a plate
170
Jacob Asper @jacobasper.com · 19/03/2025
Wrote some terrible code to get multiple grammar errors working together! Now you can be notified of sticky lines. Sticky words hold sentences together but can make them tough to get through Some examples are "so", "the", "that", "a" I'm thinking about user configurable thresholds eventually!
An editor with a context menu showing an error with the message "Grammar Error Glue percentage too high: 66.7%"
030
Jacob Asper @jacobasper.com · 18/03/2025
Wrote an SVG by hand since I couldn't find any tools that worked well. Now I have a very nice squiggly boy under my errors! The top is the browser default and the below is mine What do y'all use to edit SVGs, since random websites are not it ha
An editor with squiggly red underlines to denote errors<svg width="4" height="5"
  xmlns="http://www.w3.org/2000/svg">
  <path stroke="#ff0000" fill="none" stroke-linecap="round" stroke-opacity=".75" d="
  M 0,2
  Q 2,5 4,2
  "/>
</svg>
030
Jacob Asper @jacobasper.com · 17/03/2025
There are real errors coming from a real server now! I started with checking if the first word on a line was capitalized You may notice that the underline doesn't show up under the g, and that's because underlines on Firefox just do that for some reason, so text decorations aren't viable here
An uncaptilized word has an underline under it. A context menu says that it should be capitalized
011