{"version":"1.0","profile":{"name":"Tom Fletcher","alias":"rgbjoy","url":"https://rgbjoy.com","description":"Tom Fletcher is a full-stack engineer and creative developer who designs and builds for the web, from client sites and product systems to shader experiments. Available for new work.","profiles":[{"name":"GitHub","url":"https://github.com/rgbjoy/"},{"name":"Instagram","url":"https://www.instagram.com/rgbjoy/"},{"name":"X","url":"https://x.com/rgbjoy"},{"name":"LinkedIn","url":"https://www.linkedin.com/in/rgbjoy/"}]},"source":"https://rgbjoy.com/directory","total":34,"entries":[{"id":"project:scriptlet.app","kind":"project","title":"scriptlet.app","url":"https://scriptlet.app","year":"2026","description":"A native Mac app for running, watching, and stopping package.json scripts while coding agents work.","technologies":["Swift"],"keywords":[]},{"id":"project:futurebyday.com","kind":"project","title":"futurebyday.com","url":"https://futurebyday.com","year":"2026","description":"An interactive savings calculator for exploring how daily contributions could grow over time, comparing risk levels, and planning toward a savings goal.","technologies":["vinext","StyleX"],"keywords":[]},{"id":"project:golfisweird.com","kind":"project","title":"golfisweird.com","url":"https://golfisweird.com","year":"2026","description":"Something weird for golf, in the works. All it takes is one good look.","technologies":["vinext","Three.js"],"keywords":[]},{"id":"project:tenniswoodsmiles.com","kind":"project","title":"tenniswoodsmiles.com","url":"https://tenniswoodsmiles.com","year":"2026","description":"A patient-focused site for a multigenerational dental practice, built with Payload CMS and Next.js.","technologies":["Next.js","Payload CMS"],"keywords":[]},{"id":"project:veronightout.com","kind":"project","title":"veronightout.com","url":"https://veronightout.com","year":"2026","description":"A curated guide to the best bars, restaurants, and local hangouts in Vero Beach, with clear vibes for every spot.","technologies":["Next.js","PayloadCMS"],"keywords":[]},{"id":"project:valeriechiang.com","kind":"project","title":"valeriechiang.com","url":"https://valeriechiang.com","year":"2025","description":"A portfolio site for a New York City photographer and filmmaker, built with Payload CMS.","technologies":["Next.js","PayloadCMS"],"keywords":[]},{"id":"project:thenewrepublic.com","kind":"project","title":"thenewrepublic.com","url":"https://thenewrepublic.com","year":"Ongoing","description":"Reader-facing features and custom editorial CMS tooling for the magazine, built and shipped front to back.","technologies":["React"],"keywords":[]},{"id":"project:oib.beer","kind":"project","title":"oib.beer","url":"https://oib.beer","year":"2025","description":null,"technologies":["Next.js","PayloadCMS"],"keywords":[]},{"id":"project:checkcheck.app","kind":"project","title":"checkcheck.app","url":"https://checkcheck.app","year":"2026","description":"A minimalist checklist app that lets you easily create tasks, sort, and use keyboard shortcuts.","technologies":["Next.js","PayloadCMS"],"keywords":[]},{"id":"experiment:phosphor","kind":"experiment","title":"Phosphor","url":"https://rgbjoy.com/experiments/phosphor","description":"Soft blocks of colour, crisp in one place and smeared in the next, ghosted like a video starved of bitrate and seen through a CRT's slot mask. Click for a new frame, R to roll the dice on every setting, S to save it at 4K.","category":"Generative & Visual","status":"wip","technologies":["Three.js","R3F","GLSL","lil-gui"],"keywords":["crt","slot mask","aperture grille","phosphor","scanlines","grain","glitch","compression","codec","macroblocks","ghosting","color field","blocks","abstract","generative","oklch","palette","png"]},{"id":"experiment:global-illumination","kind":"experiment","title":"Global Illumination","url":"https://rgbjoy.com/experiments/global-illumination","description":"A concrete box in the sky: sun shafts through one window, lit a second time by its own bounce light — one blue-noise ray a pixel, averaged frame over frame until the grain settles. Orbit in and out through the walls.","category":"3D & Spatial","status":"wip","technologies":["Three.js","R3F","GLSL","lil-gui"],"keywords":["global illumination","gi","bounce","indirect light","raymarch","sdf","blue noise","accumulation","path tracing","emissive","soft shadows","volumetric","god rays","bloom","aces","orbit"]},{"id":"experiment:hand","kind":"experiment","title":"Hand","url":"https://rgbjoy.com/experiments/hand","description":"A sculpted hand in grainy black and white, fingers rolling in a seamless loop. Bring the cursor into its grasp and the hand catches it.","category":"3D & Spatial","status":"wip","technologies":["Three.js","R3F","GLSL","glTF"],"keywords":["hand","fingers","loop","black and white","monochrome","film grain","skinned","rig","sculpture","cursor","grab","marble","depth"]},{"id":"experiment:endless-scroll","kind":"experiment","title":"Endless Scroll","url":"https://rgbjoy.com/experiments/endless-scroll","description":"An endless vertical list of names — fast, smooth scrolling and paired background and preview colors that crossfade on hover.","category":"Generative & Visual","status":"live","technologies":["React","CSS","Lenis"],"keywords":["endless","infinite","scroll","names","color","hover","typography"]},{"id":"experiment:ghost","kind":"experiment","title":"Ghost","url":"https://rgbjoy.com/experiments/ghost","description":"A quietly waiting sheet ghost — simulated cloth, wandering idle motion, and a gaze that notices you in the dark.","category":"3D & Spatial","status":"live","technologies":["Three.js","R3F","GLSL"],"keywords":["ghost","cloth","simulation","fabric","spotlight","idle","mouse","gaze"]},{"id":"experiment:decal-pole","kind":"experiment","title":"Decal Pole","url":"https://rgbjoy.com/experiments/decal-pole","description":"Staple images to a telephone pole — drop one anywhere and it sticks where it lands, a few degrees off true.","category":"Play","status":"live","technologies":["Three.js","R3F","drei"],"keywords":["decal","pole","flyer","poster","drag and drop","raycast","projection","telephone pole"]},{"id":"experiment:island-generator","kind":"experiment","title":"Island Generator","url":"https://rgbjoy.com/experiments/island-generator","description":"Shape a low-poly island with seeded noise, elevation bands, and live terrain controls.","category":"Play","status":"wip","technologies":["Three.js","R3F","WebGL"],"keywords":["island","terrain","generator","noise","seed","procedural","low poly"]},{"id":"experiment:frosted-glass","kind":"experiment","title":"Frosted Glass","url":"https://rgbjoy.com/experiments/frosted-glass","description":"Capsules and beads pile up against a pane — depth is spent as blur, so the far ones smear into the fog.","category":"Glass & Refraction","status":"live","technologies":["Three.js","R3F","GLSL","box3d.js","lil-gui"],"keywords":["frosted","glass","fog","blur","depth of field","physics","box3d","capsule","sdf","falloff"]},{"id":"experiment:frog-hop","kind":"experiment","title":"Frog Ace","url":"https://rgbjoy.com/experiments/frog-hop","description":"Read the wind, pull back, and spring a tiny frog across a branching lily-pad course.","category":"Play","status":"wip","technologies":["Three.js","R3F","GLSL","FBX"],"keywords":["frog","game","lily pad","three","aim","jump","wind","golf"]},{"id":"experiment:aurora","kind":"experiment","title":"Aurora","url":"https://rgbjoy.com/experiments/aurora","description":"Raymarched aurora curtains after kishimisu — spectral ribbons that drift and fold in deep space, pulsing to a generated beat.","category":"Generative & Visual","status":"live","technologies":["Three.js","R3F","GLSL","Web Audio","lil-gui"],"keywords":["aurora","raymarch","kishimisu","shader","space","spectral","beat","music","synth"]},{"id":"experiment:gradient-flow","kind":"experiment","title":"Gradient Flow","url":"https://rgbjoy.com/experiments/gradient-flow","description":"Living gradients that cross-fade curated palettes, blended in OKLab for natural color.","category":"Generative & Visual","status":"live","technologies":["Three.js","R3F","GLSL","thi.ng","lil-gui"],"keywords":["gradient","color","palette","oklab","natural","mesh","shader","thi.ng"]},{"id":"experiment:glass-grid","kind":"experiment","title":"Fluted Glass","url":"https://rgbjoy.com/experiments/glass-grid","description":"A pane of segmented log-compression flutes over the left half of a soft drifting wash. The cursor sits behind the glass.","category":"Glass & Refraction","status":"live","technologies":["Three.js","R3F","GLSL"],"keywords":["glass","fluted","wash","cool drift","refraction","shader"]},{"id":"experiment:glass-cross","kind":"experiment","title":"Glass Cross","url":"https://rgbjoy.com/experiments/glass-cross","description":"A vertical glass line warping thin black wavy lines on white.","category":"Glass & Refraction","status":"live","technologies":["Three.js","R3F","GLSL"],"keywords":["glass","cross","lines","wave","black and white","refraction","shader"]},{"id":"experiment:glass-lines","kind":"experiment","title":"Glass Lines","url":"https://rgbjoy.com/experiments/glass-lines","description":"Refracted line-field glass lighting. The lines bend away from the pointer and spring back.","category":"Glass & Refraction","status":"live","technologies":["Three.js","R3F","GLSL"],"keywords":["glass","lines","refraction","samuel yan","shader","interactive","pointer","repel"]},{"id":"experiment:glass-point","kind":"experiment","title":"Glass Point","url":"https://rgbjoy.com/experiments/glass-point","description":"A 5×3 grid of point lenses refracting a flowing cosine wash background. They shy away from the pointer and spring back.","category":"Glass & Refraction","status":"live","technologies":["Three.js","R3F","GLSL"],"keywords":["glass","point","gradient","lens","refraction","shader","interactive","pointer","repel"]},{"id":"experiment:glass-waves","kind":"experiment","title":"Glass Waves","url":"https://rgbjoy.com/experiments/glass-waves","description":"Straight vertical glass lines refracting a gold cosine palette. The strips under the pointer grow wider.","category":"Glass & Refraction","status":"live","technologies":["Three.js","R3F","GLSL"],"keywords":["glass","lines","gold","palette","refraction","shader","interactive","pointer"]},{"id":"experiment:reading-glass","kind":"experiment","title":"Reading Glass","url":"https://rgbjoy.com/experiments/reading-glass","description":"A fixed strip of bent glass near the top refracts the article text with chromatic aberration as you scroll.","category":"Glass & Refraction","status":"live","technologies":["Three.js","R3F","GLSL"],"keywords":["glass","refraction","aberration","text","scroll","lens","backdrop-filter","svg"]},{"id":"experiment:ps2-intro","kind":"experiment","title":"PS2 Intro","url":"https://rgbjoy.com/experiments/ps2-intro","description":"Concrete column field, refracting glass cubes, and whirling colored light trails over base fog.","category":"3D & Spatial","status":"live","technologies":["Three.js","R3F","GLSL","Postprocessing"],"keywords":["ps2","playstation","intro","glass","fog","three","lights"]},{"id":"experiment:unbreaking-waves","kind":"experiment","title":"Unbreaking Waves","url":"https://rgbjoy.com/experiments/unbreaking-waves","description":"Five orbiting petal blobs with palette flow and soft fog wash.","category":"Generative & Visual","status":"live","technologies":["Three.js","R3F","GLSL","lil-gui"],"keywords":["waves","petals","palette","blobs","shader"]},{"id":"experiment:warped-stripes","kind":"experiment","title":"Warped Stripes","url":"https://rgbjoy.com/experiments/warped-stripes","description":"Noise-warped diagonal stripes with live-tweakable colors and warp.","category":"Generative & Visual","status":"live","technologies":["Three.js","R3F","GLSL","lil-gui"],"keywords":["stripes","warp","noise","diagonal","shader"]},{"id":"experiment:palm-leaf","kind":"experiment","title":"Palm Leaf","url":"https://rgbjoy.com/experiments/palm-leaf","description":"Tropical light filtering through large fronds.","category":"3D & Spatial","status":"live","technologies":["Three.js","R3F"],"keywords":["palm","leaf","frond","procedural"]},{"id":"experiment:rectangle-farm","kind":"experiment","title":"Rectangle Farm","url":"https://rgbjoy.com/experiments/rectangle-farm","description":"Rotating physical blocks in a neat field layout.","category":"3D & Spatial","status":"live","technologies":["Three.js","R3F"],"keywords":["rectangle","farm","grid","three","physics"]},{"id":"experiment:sky","kind":"experiment","title":"Sky Atmosphere","url":"https://rgbjoy.com/experiments/sky","description":"Procedural sky gradients and atmospheric depth.","category":"Generative & Visual","status":"live","technologies":["Three.js","R3F","GLSL","lil-gui"],"keywords":["sky","atmosphere","sun","shader"]},{"id":"experiment:gradient","kind":"experiment","title":"Black Ink","url":"https://rgbjoy.com/experiments/gradient","description":"A slow monochrome ink wash shaped by layered noise.","category":"Generative & Visual","status":"live","technologies":["Three.js","R3F","GLSL"],"keywords":["black ink","monochrome","ink wash","noise","shader"]},{"id":"experiment:wormhole","kind":"experiment","title":"Wormhole","url":"https://rgbjoy.com/experiments/wormhole","description":"Shader tunnel with a deep-space motion feel.","category":"Generative & Visual","status":"live","technologies":["Three.js","R3F","GLSL"],"keywords":["wormhole","tunnel","shader","raymarch"]}]}