Sign in

Apoorva Joshi

@apoorvaj.io
878 followers 215 following 76 posts

Computer graphics, systems programming, general methods. Working on graphics at Unity. Formerly Playdead, NVIDIA, Microsoft. apoorvaj.io 📍Copenhagen

PostsRepliesMedia
Apoorva Joshi @apoorvaj.io · 28/08/2026
I'm working on vector editing in @papaya.io, and it's not as snappy as I'd like to be. So optimization time! I built a profile capture mechanism: An in-browser shortcut toggles profiling, then pings the local server which converts it into the Tracy format, writes to disk, which I view in the GUI.
Tracy profiler GUI
030
Apoorva Joshi @apoorvaj.io · 27/06/2026
Added rich text editing to papaya.io, powered by the excellent Skribidi library. :) This was a joy and a challenge to implement, and I'm sure there are still rough edges.
020
Apoorva Joshi @apoorvaj.io · 09/05/2026
Still having fun building papaya.io. Just implemented a pretty nifty compressed export feature, with swipe to compare. Supports JPEG, WebP and PNG compression for now.
Image export interface, image of two boats with a swipeable UI in the middle. The left half of the image is original, the right half is garbly and JPEG compressed.
010
Apoorva Joshi @apoorvaj.io · 08/04/2026
Implemented some fun stroke dynamics based on mouse speed in papaya.io in an evening.
040
Apoorva Joshi @apoorvaj.io · 07/04/2026
👀
110
Apoorva Joshi @apoorvaj.io · 30/03/2026
I had an index variable that kept track of the latest processed element in a list. gpt-5.3-codex today named it `watermark`, and I cannot get over the beauty of it.
010
Apoorva Joshi @apoorvaj.io · 21/08/2025
Holy crap, #ziglang 0.14 -> 0.15.1 is quite the breaking change. This is literally 5% of @papaya.io's Zig codebase.
030
Apoorva Joshi @apoorvaj.io · 20/06/2025
*Tin foil hat* Has Google added a special case for Google Docs in Chrome to show the MacOS accent menu in the right spot? It renders out of the window in Firefox, which is what you'd expect to happen when using a hidden textbox to get input. I cannot find a web API do this. Looks like an inside job.
030
Apoorva Joshi @apoorvaj.io · 15/06/2025
Still long way to go, but got the beginnings of IME text composition working in papaya.io. I'm super impressed that @mikkomononen.bsky.social's Skribidi library even has this feature. Here's a video of me typing in '⌥-u' and then 'o' on Mac, which results in 'ö'.
030
Apoorva Joshi @apoorvaj.io · 12/06/2025
If you've ever worked with font rendering, then you'll know that it's the most impressive to get the fonts looking good at low sizes, because then hinting comes into play, which is where FreeType shines over other simpler libraries.
100
Apoorva Joshi @apoorvaj.io · 12/06/2025
Got simplified Chinese and FreeType variable font rendering to work in papaya.io.
121
Apoorva Joshi @apoorvaj.io · 11/06/2025
Multi-script rendering in papaya.io is starting to come together. Here's glyph caching and retrieval across several fonts (including an emoji font)!
020
Apoorva Joshi @apoorvaj.io · 09/06/2025
Added intermingled rendering of Latin and emoji (from different font files) to papaya.io. (Also look at that automatic word-wrapping and left-alignment, courtesy of Skribidi!)
010
Apoorva Joshi @apoorvaj.io · 08/06/2025
Emoji font rendering in papaya.io with @mikkomononen.bsky.social's github.com/memononen/Sk... library. Next up: intermingling font and emoji rendering.
062
Apoorva Joshi @apoorvaj.io · 04/06/2025
(cc @omershapira.com) Fun fact, this is also useful in computer graphics. The complex IOR can be converted into an F0 (Fresnel reflectance value of a ray aligned with the normal). This can be used in Schlick's approximation. en.wikipedia.org/wiki/Schlick...
110
Apoorva Joshi @apoorvaj.io · 03/06/2025
Started implementing text rendering for papaya.io. Got FreeType and HarfBuzz compiling to WebAssembly. Here's a demo of kerning working with Roboto.
240
Apoorva Joshi @apoorvaj.io · 22/05/2025
Just relaunched papaya.io — a web-based image editor I've been building on nights and weekends. What's new: - .ppy file format for local saves - Automatic browser persistence - WebP import/export support Building fast and shipping features regularly. Try it out — feedback very welcome.
161
Apoorva Joshi @apoorvaj.io · 20/05/2025
130
Apoorva Joshi @apoorvaj.io · 15/01/2025
Spotted some DirectX code in the movie Mars Express. www.imdb.com/title/tt2691...
060
Apoorva Joshi @apoorvaj.io · 07/12/2024
✅ Toy 2, differentiable rendering ( #PBR + #ML ): Learning the diffuse and roughness map. This was way harder than learning just the diffuse map given a fixed roughness, and I learnt a LOT along the way.
080
Apoorva Joshi @apoorvaj.io · 14/11/2024
✅ Toy 1, PBR + ML: Learning the diffuse map Ground truth: 128x128 diffuse map fed into disney diffuse + ggx lambert Inference: 128x128 weights map fed into same model. L2 loss, learnt on a laptop GPU in 13 seconds. Visually identical results.
0101
Apoorva Joshi @apoorvaj.io · 11/11/2024
Git Fork always freezes for several minutes when I revert or stage a few thousand files. Took a leaf out of @sschoener.bsky.social 's book and Superluminaled it. Turns out almost all of that time is taken on a UI update, 70% of which is an Array.ContainsItem check. Smells like an easy fix!
0151
Apoorva Joshi @apoorvaj.io · 10/11/2024
Training my first ever original ML model, and finally got a dropping loss function. It was quite hard to get to this point, figuring out a workable learning rate, input data, and batch size. I still can't run on the GPU for some reason, and my final output is still garbage, so lots to do.
0101
Apoorva Joshi @apoorvaj.io · 02/11/2024
Did some physically based rendering in numpy. GGX specular + Disney diffuse. Textures from matlib.gpuopen.com/main/materia...
030