Sign in

phil 🫠

@kitten.sh
1.3K followers 284 following 138 posts

👋 strangely typed • dev tools at @expo.dev 𝝠 • n+1 semi-archived GraphQL/TS/React(Native) projects 🗻 • urql, gql.tada (prev. dank mono, css-in-js shenanigans) • 🐙 github.com/kitten & tangled.sh/@kitten.sh

PostsRepliesMedia
phil 🫠 @kitten.sh · 03/03/2026
quality of life feature in @expo.dev 55, iOS dev builds using expo-dev-client will discover devservers on the local network automatically ✨📡 qr codes are finally fully optional now 😄
1113
phil 🫠 @kitten.sh · 03/03/2026
bit of a funny blunder to do a big, transparent & comprehensive ToS change + notification to then accidentally write that you have to be 18 to use Zed implying the software when you meant (as per the terms) the service/subscription 😅
010
phil 🫠 @kitten.sh · 19/02/2026
small detail in Expo SDK 55 (beta) 🧹 the startup output will reduce itself in short terminal windows, and smaller QR codes render in terminal apps that support it
Startup screen in Expo showing the QR code and the help output. The help output omits most key instructions, and the QR code is rendering at an increased density (smaller)
030
phil 🫠 @kitten.sh · 04/12/2025
ram cleaner aah vibe
040
phil 🫠 @kitten.sh · 20/11/2025
damn, this new ai code editor is awesome
VSCode with Internet Explorer spamware toolbars
230
phil 🫠 @kitten.sh · 03/10/2025
clearly, whoever is tasked with writing these is running out of ways to say "lol no"
Email in response to UK petition: The Government has responded to the petition you signed - "Repeal the Online Safety Act".
Government responded:
The Government is working with Ofcom to ensure that online in-scope services are subject to robust but proportionate regulation through the effective implementation of the Online Safety Act 2023.Email in response to UK petition: The Government has responded to the petition you signed - "Do not introduce Digital ID cards"
Government responded:
We will introduce a digital ID within this Parliament to help tackle illegal migration, make accessing government services easier, and enable wider efficiencies. We will consult on details soon.
030
phil 🫠 @kitten.sh · 24/09/2025
hm does blocking the dev of the app block the app though? not that it matters much since they can just create more accounts & apps, but basically just seeing an app and a big install button first feels bad here 😅
120
phil 🫠 @kitten.sh · 17/09/2025
please :c, or else >:c
110
phil 🫠 @kitten.sh · 12/09/2025
there's also an experiment that allows you to auto-resolve issues with duplicate native module dependencies or hoisting conflicts (monorepos rejoice!) ✨ flip one flag, and Expo Autolinking also applies its autolinking decisions to Expo's metro bundling
Pictured: "expo.experiments.autolinkingModuleResolution" is set to "true" in the Expo app.json config
130
phil 🫠 @kitten.sh · 12/09/2025
Expo Autolinking is more transparent and consistent now. Both expo-doctor and the expo-modules-autolinking verify command can now consistently highlight issues with duplicate dependencies 👀🕵️ (the screenshot here shows the output that Bluesky gets for debugging, for example)
the terminal output of the "expo-modules-autolinking verify" command shows conflicts and duplicates between native modules. For example, two versions of expo-device were found, since one is pulled in under a sub-dependency.
120
phil 🫠 @kitten.sh · 12/09/2025
Autolinking will also work much more like "what you see is what you get" with transitive linking for RN modules, better duplicate detection, better hoisting conflict detection, etc this also means we can safely expand our official package manager support!
npm packages mapped to native modules. An npm package for react-native-reanimated, for example, means, there's a native module for react-native-reanimated. If there's two packages for expo-audio, one is marked as a duplicate.
120
phil 🫠 @kitten.sh · 12/09/2025
a lot of implicit deps chains are fixed. One example, if something else depends on Metro that won't break Expo in any case anymore (Pictured: @expo/metro-config's deps graph. And yes, we're also working on reducing deps continuously, more news on that soon)
the dependency graph of @expo/metro-config. It's a large tree of the npm dependencies, but illustrates how many dependencies go into Expo's bundling configuration, for example with @expo/metro pointing at all Metro packages
150
phil 🫠 @kitten.sh · 24/08/2025
really have to finish a new blog post, so instead, I of course took @arrowtype.bsky.social's amazing Recursive font, made some tweaks (rough sketch still due to some import issues), threw it in my blog that hasn't seen new posts for 5yrs and updated its colour scheme priorities ❤️
side by comparison of the "Recursive" font (by ArrowType) and the fork ("TailRecursive") showing mainly removed slab-style serifs on ascenders on the font's glyphs.
230
phil 🫠 @kitten.sh · 21/08/2025
no matter the app, you really can't escape the inevitable @freezydorito.lol for long 😂😂
one of laura's post on Digg
151
phil 🫠 @kitten.sh · 14/08/2025
🎉📱
pnpm isolated, pass;
pnpm hoisted, pass;
bun isolated, pass;
bun hoisted, pass;
npm, pass;
yarn classic/v1, pass;
yarn berry hoisted, pass
020
phil 🫠 @kitten.sh · 12/08/2025
🤔
120
phil 🫠 @kitten.sh · 13/02/2025
maybe i care less about spending time with and on graphql these days, but i do care about numbers going up 📈
comparative benchmark of "@0no-co/graphql.web" (version 1.0.13 and 1.1.0) compared to "graphql.js" version 16. Version 1.1.0 of "graphql.web" can be seen to be 25% faster, now beating graphql.js by 70% in a representative kitchen sink query. Beating itself by 16% with a smaller query, and "graphql.js" by 41% with the smaller query.
0140
phil 🫠 @kitten.sh · 04/11/2024
pretty exciting, since, as this is based on TS' getDefinitionAtPosition's own implementation, this gives us a lot of confidence in its robustness. All I removed were edge cases we don't encounter, and just using TS symbols also mean we can limit the amount of AST nodes we end up resolving to
A piece of TS code showing the AST symbols that symbols internally can end up at (which are all value declaration TS types). A `getValueOfValueDeclaration` function is provided that returns the identifier given a binary assignment expression, and the initializer given any AST node that declares a value (e.g. property assignments or variable declarataions)
010
phil 🫠 @kitten.sh · 04/11/2024
eventually I'll have to find some time to work more on GraphQLSP (the TS plugin used by gql.tada for LSP integration) currently, we use TS' getDefinitionAtPosition a lot to get to GraphQL document references, but I've got a PR that looks to switch this to a symbol-based implementation instead
extracted code from TypeScript's "go to definition" service. This is part of going to the definition from an AST identifier. This code extracted looks at resolving aliased symbols, then goes to that symbol's value declaration.
170
phil 🫠 @kitten.sh · 02/11/2024
(small behind-the-scenes effort) the @expo.dev SDK 52 will shed several old/unused npm deps in future SDKs pre-bundling, more fixes, and external changes will help too But overall, installing SDK 52 will already be faster than installing SDK 51 🚀 (npm graph side-by-side for comparison)
Expo npm dependencies graphs of the `expo` meta packages comparing SDK 51 and SDK 52 (preview).
The SDK 52 dependency graph has lost a lot of dependencies.
4335
phil 🫠 @kitten.sh · 31/10/2024
no judgement here right? but opening a UDP socket in Node seems to be a very reliable and portable way to get the preferred & public network route's IP address 😅 seems odd, but also(!) seems to work 🥲
Node spawnSync of inline code that creates a UDP4 socket (via "node:dgram") to "1.1.1.1" and writes the socket's address to standard output. The spawned standard output is then returned and compared to "node:os"'s "networkInterfaces()" array output. If a non-internal IPv4 address matches, we determine this to be the internal network IP address.
060
phil 🫠 @kitten.sh · 30/10/2024
my goal hence was to use Linux's usbhid driver (instead of a custom one) to re-use all of its logic while still applying mouse acceleration. this can actually be done by shifting the mouse acceleration logic to an input handler. In an input handler we get to filter and modify events
A diagram of how Linux USB drivers interact with the Input Subsystem. USB Devices are picked up and bridges by Input drivers to Input Devices, creating input events. These events get sent into the Input Subsystem. The Input Subsystem contains a pipeline of "Input Handlers" which process all events, before they get sent to User Space
120
phil 🫠 @kitten.sh · 30/10/2024
However, this didn't really work for some of mice. turns out, the leetmouse driver is a full USB driver — taking the default Linux's usbhid driver's place This is very low level, but has a big drawback. It loses out on Linux working around many USB devices' quirks, so some devices just don't work
a screenshot showing part of many files listing USB device manufacturers and devices, which work around many USB devices' oddities and quirks.
120
phil 🫠 @kitten.sh · 30/10/2024
For Linux, there's "Leetmouse" (which is a fork of another older project) adding the same functionality. And recently someone forked this project to add a GUI to this mouse driver, called "Yeetmouse" (yes, it's a fork of a fork 😄) They added a really nice Imgui interface to configure the driver
The Yeetmouse GUI, similar to the Rawaccel one. Showing a graph of mouse sensitivity in relation to input speed with configuration inputs
120
phil 🫠 @kitten.sh · 30/10/2024
Rawaccel is quite interesting. it's a Windows driver that can be configured with a small UI that, instead of keeping a constant mouse sensitivity, makes sensitivity configurable. It changes depending on the current input speed, usually accelerating mouse movement the faster you move your mouse.
The UI of "Rawaccel" to configure a mouse acceleration driver. With several input parameters (like "sens multiplier", a mode, and more parameters) it displays a graph of the mouse sensitivity changing with input speed.
130
phil 🫠 @kitten.sh · 02/04/2024
parsing & printing in @​0no-co/graphql.web is now even speedier (faster than graphql.js) 📄 recap: graphql.web is a spec-compliant lib for GraphQL parsing, printing, and visiting for client-side GraphQL clients and a drop-in replacement. It ships by default with urql
Benchmarks for graphql.web for parsing and printing. Parsing is 1.26x faster than the current published version and 1.3–1.47x faster than graphql.js. Printing is 2.32x faster than the current published version and 9.94–34.16x faster than graphql.js.Benchmarks for graphql.web for parsing and printing without warmup time (only one sample in benchmarks, so the JIT won't kick in).
Parsing is 1.72x faster than the current published version and 3.14–3.66x faster than graphql.js. Printing is 4.95x faster than the current published version and 5.55–9.23x faster than graphql.js.
021
phil 🫠 @kitten.sh · 30/03/2024
so far this weekend, I’ve been working on updating my colour scheme. picked out 20 colours (16 ansi and 4 UI colours) while my colour blindness was sabotaging me. This was exhausting
List of colours in a colour scheme following xterm16 with some extra coloursColour Swatch with all colours from previous image
110
phil 🫠 @kitten.sh · 07/03/2024
huge success 🎂
flame graph showing a time of 1.1s compared to the prior picture posted.
010
phil 🫠 @kitten.sh · 02/03/2024
please make this stop 🥲 please let this be an easy fix
Chrome Trace of a TypeScript tracing dump with added `instantiateType` traces that show tens of thousands of deep traces across a >20s window.
180