Sign in

Ash

@ash.pink
157 followers 166 following 230 posts

🌱 The Web and Stuff - Software Engineer at @sanity.io ✨ ui 💕 server 🌈 html 🦦 css ⚛️ react 🔌 ts 🌍 Chichester, UK 📠 ash.gd

PostsRepliesMedia
Ash @ash.pink · 17/09/2025
Really excited to discover jj-stack. Jujutsu VCS is great for working with stacks, but lacks some of the niceties of tools like Graphite when it comes to submitting those stacks to GitHub. jj-stack creates PRs for your stack, and maintains a comment on each PR detailing the stack (huge!).
A comment on a GitHub PR detailing the position of the PR in a stack, automatically managed by jj-stack.
230
Ash @ash.pink · 03/09/2025
Love them! 🔥 FYI trying to use Safari on iOS with Apple Pay and getting stuck in a loop of “Your cart has been updated based on your shipping country.”—not sure if you’re shipping these internationally?
Your cart has been updated based on your shipping country.
100
Ash @ash.pink · 26/05/2025
Sterling Archer “phrasing” meme.
010
Ash @ash.pink · 02/04/2025
Why do trains show me all this useless information over and over when I just want to check what the destination is? This is and has always been a terrible experience.
A useless display on a train prompting me to follow them when I just want to check the destination.
110
Ash @ash.pink · 25/02/2025
Testing Flashes for Bluesky. 04:09, Ericeira, 24 September 2023. One of my favourites.
Looking up at a palm tree illuminated by street lamps, against the starry night sky.
090
Ash @ash.pink · 24/02/2025
A screenshot of the Windows Pipes screensaver. Because you can pipe observables. It’s a bad joke for old people.
000
Ash @ash.pink · 13/02/2025
An XML sitemap, in seventeen lines of GROQ. github.com/juice49/frid...
XML sitemap generation code in a text editor. The entire code is:

import type { MetadataRoute } from 'next'
import { firstValueFrom } from 'rxjs'
import { sanityClient } from '../sanity-client'

const BASE_URL = 'https://fridayclub.co'

const SITEMAP_QUERY = `
  [
    {
      "url": $baseUrl,
      "lastModified": *[_type == "article"] | order(publishedAt desc)[0].publishedAt,
      "changeFrequency": "weekly",
      "priority": 1,
    },
    ...*[_type in ["artist", "track", "releaseGroup"]] {
      "url": select(
        _type == "artist" => array::join([$baseUrl, "artists", slug.current], "/"),
        _type == "track" => array::join([$baseUrl, "tracks", slug.current], "/"),
        _type == "releaseGroup" => array::join([$baseUrl, "release-groups", slug.current], "/"),
      ),
      "lastModified": coalesce(_updatedAt, _createdAt),
      "changeFrequency": "monthly"
    }[defined(url)]
  ]
`

export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  return firstValueFrom(
    sanityClient.fetch(SITEMAP_QUERY, {
      baseUrl: BASE_URL,
    }),
  )
}
220
Ash @ash.pink · 13/02/2025
Lovely piece by Simon Bailly. (Yes I am posting a screenshot of an Instagram post. Instagram, why do you have to be so hostile to people sharing links? Oh yes, I remember, you are a vampire that must feed on our data.) HAPPY THURSDAY www.simon-bailly.com www.instagram.com/p/DGBEbDZCbGa
A human dressed as a butcher feeds their brain into a meat grinder, yielding three homogenous patties of human brain meat labelled “ChatGPT”, “deepseek”, and “Midjourney”. Illustration by Simon Bailly.
000
Ash @ash.pink · 07/02/2025
An interesting detail I didn't anticipate about automatically importing data from MusicBrainz: "Various Artists" seems to exist as an artist entity. musicbrainz.org/artist/89ad4...
"Various Artists" document in the fridayclub Sanity Studio.
000
Ash @ash.pink · 19/01/2025
Today's challenge: programmatically generating Apple Music playlists. In the apparent absence of docs, I'm hoping to reverse engineer the XML that Apple Music generates when exporting a playlist. So far, I would describe the experience as annoying.
A programatically generated XML playlist after it has been imported to Apple Music. The tracks are visible, but cannot be played.
020
Ash @ash.pink · 09/01/2025
I landed on using Warp for a while, mainly because it provided a nice terminal experience out of the box. However, I don't love its focus on AI stuff, and I think it generally aims to be way more than I want. Now trying Ghostty, fish shell (for the first time!), and Starship prompt. It's nice.
Fish shell's git checkout autocompletion in Ghostty using Starship prompt.
100
Ash @ash.pink · 20/12/2024
As it turned out, I’d still be creating new bugs twenty years later.
A screenshot of a post published on 11 September 2004 to one of my first ever websites. It reads “I’ve fixed all the bugs”.

It received zero comments.
070
Ash @ash.pink · 27/11/2024
If you declare a CSS custom property inside a style, Mist will add it to the element's `style` prop type. This gives you custom property name suggestions when using the `style` prop to override the custom property value. It's neat. However, it does make the prop required, which sees odd to me.
A screenshot demonstrating the way MistCSS handles CSS custom properties. The first pane shows the declaration of a `--color` custom property inside a CSS style. The second pane shows the compiled Mist TypeScript code (the `--color` property has been added to the element's `style` prop). The third pane shows a React component that renders the element, with autocomplete inside the `style` prop suggesting the `--color` custom property.
000
Ash @ash.pink · 20/11/2024
What a beauty! I had a run-in with a wild beast myself just this lunchtime.
Marcello the cat eyeing up my cheese on toast.
120
Ash @ash.pink · 23/03/2024
Panic's Nova code editor has an awesome built in syntax inspector. Super helpful if you're building a syntax grammar extension. Also, I love Zed, but I'd forgotten how great Nova looks.
Screenshot of my work in progress GROQ syntax grammar extension for Panic Nova, with Nova's syntax inspector enabled.
000
Ash @ash.pink · 18/10/2023
I'd say my migration from Chrome to Satori generated Open Graph images is going pretty well. Here's two examples of Chrome generated images alongside their Satori counterparts.
Two examples of Chrome generated images alongside their Satori counterparts. The layout, typography, and colours are almost identical.
000
Ash @ash.pink · 03/08/2023
Nice. Wrap guides (vertical rules) just landed in Zed. Enable them by adding an array of line lengths to your config, with the `wrap_guides` key. zed.dev/releases/stable
Screenshot of my Zed config, with the `wrap_guides` property highlighted. Its value is `[80]`.
000
Ash @ash.pink · 30/07/2023
I never really got the hang of the whole blogging thing.
Screenshot of a blog post I published 2007-01-08 reading “Well, I really wasn’t happy about the quality of the content on this blog, so I’ve decided to start again…”.
000
Ash @ash.pink · 08/07/2023
One year since the first commit on my current main side project. It’s a TypeScript query builder for the GROQ query language. Maybe it’ll never be released, but I’ve learned so much.
Initial commit in my git project. The date is 8 July 2022.
050
Ash @ash.pink · 03/07/2023
This moment. Emotion Sickness. www.youtube.com/watch?v=JkChW6WP0hU
Still shot from the Emotion Sickness music video by Queens Of The Stone Age. The protagonist drunkenly stumbles through a room that resembles a kaleidoscope. The music becomes off-kilter. The lyrics are "Then my fever broke". It is awesome.
000
Ash @ash.pink · 11/06/2023
hello 🐍
Queens Of The Stone Age - In Times New Roman...
000
Ash @ash.pink · 10/06/2023
pretty cool up there
Photo of the night sky between rugby goal posts.
020
Ash @ash.pink · 07/06/2023
🌱
Selfie with the plants in my office.
110