Sign in

Mark Malstrom

@malstrom.me
721 followers 812 following 3.4K posts

Wake me up when the DEFCON levels have changed. They/them. malstrom.me

PostsRepliesMedia
Mark Malstrom @malstrom.me · 22h
A “Loading…” screen for Remix showing a pit crew carrying tires across the screen
000
Mark Malstrom @malstrom.me · 30/09/2026
Grain of salt — I specifically focused on performance for this update — but I recently converted my portfolio (malstrom.me) from Astro to Remix and managed to achieve better lighthouse scores for all of my poorest performing pages
Screenshot of an Oh My Pi terminal chat showing a Lighthouse mobile performance comparison between a production Astro site and a Remix preview. A table lists several pages with Lighthouse scores, LCP times, and transfer sizes. Remix performs better on every highlighted page: /about improves from 90, 3.6 s, 482 KB to 99, 1.9 s, 218 KB; /blog/talks from 94, 2.4 s, 1263 KB to 100, 1.5 s, 324 KB; /blog/learning-remix-3 from 82, 4.4 s, 620 KB to 96, 2.2 s, 293 KB; and /blog/mexico-city from 75, 16.9 s, 32 MB to 98, 2.4 s, 4.5 MB. Six other pages score 99–100 in production and 100 in preview.
000
Mark Malstrom @malstrom.me · 13/09/2026
🤔
A concept design for a travel app on the iPhone Duo, showing it in closed mode with a list of cards for an itinerary for a “Spain Scouting” tripA concept design for a travel app on the iPhone Duo, showing it in unfolded mode with a list of cards for an itinerary for a “Spain Scouting” trip on the left and details about the “Hotel El Palace” on the right
000
Mark Malstrom @malstrom.me · 06/09/2026
100
Mark Malstrom @malstrom.me · 06/09/2026
👀
import { fixed, grow } from "@bomb.sh/tty";
import { Box, style, Text } from "@pitlane/tui";
import { on, type Handle } from "@remix-run/ui";

function TaskRow(handle: Handle<{ item: QueueItem }>) {
    let queue = handle.context.get(App);
    let runs = 0;
    queue.terminal.addEventListener(
        "input",
        event => {
            let key = event.detail;
            if (key.type !== "keydown" || key.ctrl || key.alt) return;
            if (
                queue.selected === handle.props.item.id &&
                (key.code === "Enter" || key.code === " ")
            ) {
                increment();
            }
        },
        { signal: handle.signal },
    );

    function increment(): void {
        runs++;
        handle.update();
    }

    return () => {
        let { item } = handle.props;
        let selected = queue.selected === item.id;
        return (
            <Box
                mix={[
                    style({
                        bg: selected ? selectedBackground : background,
                        layout: { width: grow(), height: fixed(1), direction: "ltr" },
                    }),
                    on("pointerclick", () => {
                        queue.select(item.id);
                        increment();
                    }),
                ]}
            >
                <Text mix={style({ color: selected ? accent : foreground })}>
                    {selected ? "> " : "  "}
                    {item.label} · {runs} {runs === 1 ? "run" : "runs"}
                </Text>
            </Box>
        );
    };
}
100
Mark Malstrom @malstrom.me · 22/08/2026
Going to the JSX factory, does anyone need any components or maybe some intrinsic elements?
A sign that reads “JSX 7201 & 7205 Lemmon Avenue”An airplane hangar with a parking lot in front of it and a sign that says “Fly JSX” on the hangar
030
Mark Malstrom @malstrom.me · 20/08/2026
Remix 3 got a few packages this week that enable HMR and I've already got them integrated into my Vite plugin and working in all my Remix apps 😈 Official release tomorrow
Per-app results showing six applications. All six passed server-data hot module replacement (HMR) and had clean typechecks. Remix 3 Contacts, commit 889f4a3 on main, has 4 islands and passed component HMR. Mapper, commit 5358636 on main, has 2 islands and passed component HMR. Quintessential Guide, commit 0043a88 on main, has 1 island and passed component HMR. Commonwealth Platform, commit ebfb01d on main, has no islands, so component HMR is not applicable. Malstrom.me, commit d29076e on the remix branch, has 2 islands and passed component HMR. Maitre-d, commit da61bd8 on main, has no islands, so component HMR is not applicable. All listed branches are marked FF.
120
Mark Malstrom @malstrom.me · 07/08/2026
I was doing SO GOOD on this trip too. I got a 99/100 sleep score last night.
Thu, Aug 6

99
Very High

• Duration: 8h 49m • 50/50
• Bedtime: 41m earlier than average • 30/30
• Interruptions: 3 wake-ups, 8m total • 19/20
000
Mark Malstrom @malstrom.me · 02/08/2026
gm top chickens
A view from Williamsburg of the lower Manhattan skyline
050
Mark Malstrom @malstrom.me · 21/07/2026
Don't mind me
 Designing detailed OpenAPI JSON structure                                                                                                                            

✎ Write: 🧾 docs/x-api/openapi.json · 843 lines 
│   1 {                                                                                                                                                              │
│   2   "openapi": "3.1.0",                                                                                                                                          │
│   3   "info": {                                                                                                                                                    │
│   4     "title": "X/Twitter Internal API Compatibility Profile",                                                                                                   │
│   5     "version": "observed-2026-07-20",                                                                                                                          │
│   6     "description": "An observational, read-oriented compatibility reference for undocumented X/Twitter internal endpoints. This is not an official API         │
│ contract. Do not embed client secrets or use credentials, accounts, or data without explicit authorization. Opaque GraphQL operation IDs and payload shapes can    │
│ change without notice."                                                                                                                                            │
│ … 837 more lines ⟦Ctrl+O: Expand⟧
000
Mark Malstrom @malstrom.me · 18/07/2026
Happy caturday
A small black cat (Tommy, Thomas, Tummy, Mr. Tumnus) lying asleep on a bed with beige checkered sheets and a rust-orange comforter as shot from behind a laptop screen
020
Mark Malstrom @malstrom.me · 10/07/2026
Meme: JESUS, I SEE WHAT YOU'VE DONE FOR OTHER PEOPLE, AND I WANT THAT FOR ME
000
Mark Malstrom @malstrom.me · 10/07/2026
Welp, I guess that's it for me until I can figure out how to self host an entire Bluesky stack 🙃
Age Assurance
Hey there!
You are accessing Bluesky from a region that legally requires us to verify your age before allowing you to access the app.
Based on your network, we think you're in Texas, United States. This estimate may be inaccurate if you're using a VPN.
• Verify now
Age assurance only takes a few minutes.
Bluesky
To log out, click here. Or if you'd prefer, you can delete your account.
210
Mark Malstrom @malstrom.me · 09/07/2026
wint @dril: and another thing: im not mad. please dont put in the newspaper that i got mad.
000
Mark Malstrom @malstrom.me · 26/06/2026
i was going to apply but didn't know how to answer this question :/
A screenshot of a Gem Job Application listing:

Please explain how you sauce your bacon butty: red or brown? *
[text area for replying]

By applying you agree to Gem's terms and privacy policy.

Save your info to apply to other roles faster & help employers reach you.

Apply and save
Apply without saving
020
Mark Malstrom @malstrom.me · 19/06/2026
I should use Ultracode to reimplement the Bluesky stack in Swift
Cat newspaper meme
151
Mark Malstrom @malstrom.me · 16/05/2026
A version of the “utopian society” meme where everything is rusty
0242
Mark Malstrom @malstrom.me · 04/05/2026
Don’t forget to put some marinade on your Claudemeal
Bottles of “Claude’s Original Marinades” in “BBQ Brisket” and “Fajita” flavors sitting on a grocery store shelf
092
Mark Malstrom @malstrom.me · 30/04/2026
"kira liquid cooling water" in the style of the TMNT logo
020
Mark Malstrom @malstrom.me · 30/04/2026
👀
Remix-branded shipping containers being loaded onto a tanker at dawn/dusk; taken from the new cover image from the Remix Discord
120
Mark Malstrom @malstrom.me · 27/04/2026
Working on something for the @remix.run, @vite.dev, and @cloudflare.social ecosystems I think is pretty cool and I'm pretty excited about 🤠
An F1 car under a car cover in a pit garage with a "P" logo emblazoned on the cover. The "P" is roughly in the shape of a race track and there are three red checkers to the left of the "P". The "P" logo also appears in a sign above the garage. There are tires and toolboxes inside the garage as well as a person in a jumpsuit at the back of the garage behind the car with their back turned to the viewer.
3132
Mark Malstrom @malstrom.me · 11/04/2026
Just… wow. images.nasa.gov
A view of the moon from deep space, the Earth just barely visible rising over the top of itA closer-up view of the moon, the Earth barely visible rising over the top of it
0160
Mark Malstrom @malstrom.me · 24/03/2026
It’s kinda wonky on mobile
A screenshot of the Vite Plugin Registry in Mobile Safari, showing search at the top and some cards for each plugin in a list. The cards are bleeding off the right edge of the screen and obscuring some information.
110
Mark Malstrom @malstrom.me · 22/03/2026
Okay, hear me out:
"use server";

import { query } from "@withsprinkles/server/functions";
import { setTimeout as sleep } from "node:timers/promises";

export const now = query.live(async function* () {
    while (true) {
        yield new Date();
        await sleep(1000);
    }
});

// =================================================================

"use client";

import type { LiveResource } from "@withsprinkles/server/functions";
import { use } from "react";

export function DateTicker(
  { resource }: { resource: LiveResource<Date> }
) {
    const date = use(resource.live());
    const time = date.toISOString();
    return <time dateTime={time}>{time}</time>;
}

// =================================================================

import { DateTicker } from "./DateTicker.tsx";
import { now } from "./now.ts";

export async function Route() {
    const liveDate = now();
    
    // Automatically block the server-rendered response until the 
    // initial promise resolves
    return <DateTicker resource={liveDate} />;
}
030
Mark Malstrom @malstrom.me · 13/03/2026
Now you can install @vite.dev Plus using Homebrew! (until an official formula is created)
brew tap markmals/tap
brew install vite-plus
090
Mark Malstrom @malstrom.me · 09/03/2026
Mhm. Yep.
100
Mark Malstrom @malstrom.me · 16/02/2026
A real fucked-up arrow
110
Mark Malstrom @malstrom.me · 16/02/2026
webcomic name "oh no"
020
Mark Malstrom @malstrom.me · 14/02/2026
Screenshot from 30 Rock: Jack Donaghy standing in front of a chart showing how NBC is related to GE
030
Mark Malstrom @malstrom.me · 14/02/2026
000
Mark Malstrom @malstrom.me · 09/02/2026
Nobody better steal my idea for a Macbeth themed website
A screenshot from Hover showing "sticking.place is available. Get it for your website!" with a price of $27.99 and an "Add to Cart" button
110
Mark Malstrom @malstrom.me · 05/02/2026
I love the new @voidzero.dev logos
Logos for the VoidZero projects

VOID ([Vite logo], [Oxc logo], [Vitest logo], [Rolldown logo])

The Vite logo is a purple lightning bolt
The Oxc logo is a teal anchor
The Vitest logo is a green checkmark
The Rolldown logo is two red arrows pointing down
290
Mark Malstrom @malstrom.me · 04/02/2026
Swedish meatballs. The food of my people.
A white stone plate sitting on faux-marble with fluffy mashed potatoes, dark brown gravy, and ice cream scoop-sized meatballs on top
000
Mark Malstrom @malstrom.me · 04/02/2026
Spent some time working on a room booking prototype for the Austin Public Library tonight 🤠
A screenshot of Chrome showing a white card on a gray background with some copy at the top, a search form in the middle, and a split view at the bottom with a list of library branches on the left and a map with pins of library locations on the right.

Home > Meeting Spaces > Shared Learning Rooms

Shared Learning Rooms

For smaller groups. Rooms can be booked up to 2 weeks and not less than 2 hours in advance. Book from 15 min up to 2 hrs maximum. View Booked Calendar

Location
All Available Locations

Date
02/03/2026

Duration
2hr

Number of People
___

☑️ Display/Screen
☑️ HDMI
☑️ Whiteboard

[Search]

1. Carver Branch 2.5 mi
1161 Angelina St.
1 Room Available

2. Cepeda Branch 2.9mi
651 N Pleasant Valley Rd.
2 Rooms Available

3. Central Library 3.5 mi
030
Mark Malstrom @malstrom.me · 31/01/2026
Panang curry might be my favorite curry
A stainless steel pot of red-orange curry sauce with slices of chicken on a stovetopA white bowl with white rice, red-orange curry sauce, slices of chicken, and chiffonaded Thai basil garnished on top
010
Mark Malstrom @malstrom.me · 19/01/2026
Making Mexican food in San Diego, as the good Lord intended
Elotes, queso Oaxaca stuffed hatch chiles, grilled queso panela, salsa verde, onions and cilantro, corn and flour tortillas in a tortilla warmer Homemade flour tortillas reheating on a comalMigas, flour tortillas, crema Oaxaqueña, guasacaca, salsa verde, cotija cheese, avocados, and slices of limes
000
Mark Malstrom @malstrom.me · 13/01/2026
And, there are some… questionable story choices for season 2 which I’m not necessarily looking forward to…
I know there had been some discussion about an ICE story? Will we see that this season?

Yes, we have some ICE agents show up, and how that affects people in the hospital. That's been a tricky one to try and get right without being heavy-handed and being fair to everyone on both sides of that conversation. What else do we do this year? Some fun stuff. The kind of things you would expect over the Fourth of July weekend.
010
Mark Malstrom @malstrom.me · 27/12/2025
Yes… Ha Ha Ha… YES!

> Sickos
000
Mark Malstrom @malstrom.me · 21/12/2025
Drop the "The". Just "CRuby". It's cleaner.
A screenshot from GitHub:

ruby/ruby.wasm

ruby.wasm is a collection of WebAssembly ports of the CRuby.

Language: Ruby
Stars: 816
020
Mark Malstrom @malstrom.me · 10/12/2025
Specifically
A 20oz squeeze bottle of Whataburger Spicy Ketchup with Cholula sitting on its cap. The bottle is transparent, showing the red ketchup inside. The cap is orange and the label is orange with vertical white stripes showing the Whataburger logo at the top with the product description in the center and an image of a bottle of Cholula in the bottom right corner of the label.
000
Mark Malstrom @malstrom.me · 04/12/2025
I like the biblically accurate compilation diagram
An image mimicking the classic “holy trinity” image used to explain the Christian belief in God, the Son, and the Holy Spirit, but it’s for TypeScript compilation:

The TypeScript compiler generates a .js file from a .ts file. The TypeScript compiler generates a .d.ts file from a .ts file. The presence of a .d.ts file implies the presence of a .js file.
010
Mark Malstrom @malstrom.me · 18/11/2025
I can’t help but use the trans color scheme for any of my project logos. Pink and blue, baybeeee!
A logo of a beige cake on a baby blue background with sprinkles
Icing withicing
Icing on the cake of web development

A logo of a chocolate frosted donut on a light pink background with sprinkles
Sprinkles withsprinkles
Sprinkles of tools and features for web development

A logo of a dimensional loop-de-loop “L” with a gradient of pink at the top to blue at the bottom on a beige background
loop loopui-dev
A suite of libraries, frameworks, and tools for creating Uls
040
Mark Malstrom @malstrom.me · 14/11/2025
how do folks feel about all lowercase docs?
screenshot of a dark mode chrome window with astro starlight documentation for "loop":

loop
a suite of libraries, frameworks, and tools for creating ui's
pink button: create an app with loop 🚀
white outline button: browse the loop packages 🧩

to the right of this copy there is a cursive lowercase l, stylized in a loop, dimensional with a blue to purple to pink to light red gradient traveling from the bottom loop to the top loop with a blooming pink and blue gradient behind it
010
Mark Malstrom @malstrom.me · 11/11/2025
A roast beef sandwich with fresh mozzarella and roasted red peppers on a French demibaguette with a side of jus dipping sauce — the same sandwich from the 30 Rock episode “Sandwich Day”
000
Mark Malstrom @malstrom.me · 11/11/2025
100
Mark Malstrom @malstrom.me · 11/11/2025
100
Mark Malstrom @malstrom.me · 11/11/2025
100
Mark Malstrom @malstrom.me · 11/11/2025
100
Mark Malstrom @malstrom.me · 11/11/2025
100
Mark Malstrom @malstrom.me · 11/11/2025
100