{"id":5427,"date":"2026-04-16T02:32:55","date_gmt":"2026-04-16T02:32:55","guid":{"rendered":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/?p=5427"},"modified":"2026-04-16T16:53:02","modified_gmt":"2026-04-16T16:53:02","slug":"claudes-three-js-suggestions","status":"publish","type":"post","link":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/?p=5427","title":{"rendered":"Claude&#8217;s Three.js Suggestions"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><img data-opt-id=1938656040  fetchpriority=\"high\" decoding=\"async\" width=\"617\" height=\"535\" src=\"https:\/\/ml6vmqguit1n.i.optimole.com\/w:auto\/h:auto\/q:mauto\/f:best\/https:\/\/172-234-197-23.ip.linodeusercontent.com\/wp-content\/uploads\/2026\/04\/image-13.png\" alt=\"\" class=\"wp-image-5428\" srcset=\"https:\/\/ml6vmqguit1n.i.optimole.com\/w:617\/h:535\/q:mauto\/f:best\/https:\/\/172-234-197-23.ip.linodeusercontent.com\/wp-content\/uploads\/2026\/04\/image-13.png 617w, https:\/\/ml6vmqguit1n.i.optimole.com\/w:300\/h:260\/q:mauto\/f:best\/https:\/\/172-234-197-23.ip.linodeusercontent.com\/wp-content\/uploads\/2026\/04\/image-13.png 300w\" sizes=\"(max-width: 617px) 100vw, 617px\" \/><\/figure>\n\n\n\n<p>April 15, 2026<\/p>\n\n\n\n<p>SCYTHE Session Hypergraph Offline Bundle Click behavior update:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Single-click empty space \u2192 does nothing (selection, highlights, and autoRotate-off all persist)<\/li>\n\n\n\n<li>Double-click empty space \u2192 full reset (clear selection, restore gradient, camera lerps home, autoRotate resumes) Two config controls in the header bar (appear right of the stats count): \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br>\u2502 Control \u2502 Range \u2502 Live effect \u2502<br>\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524<br>\u2502 Hops [1\u20134] \u2502 default 1 \u2502 Expands neighbor labels to hop-2, hop-3, hop-4 rings \u2502<br>\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524<br>\u2502 Max labels [1\u2013100] \u2502 default 24 \u2502 Caps how many label pills render \u2502<br>\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 Changing either input immediately rebuilds the label overlay for the currently selected node \u2014 no re-click needed. The selected node itself (distance=0) is excluded from labels; only neighbors are labeled.<\/li>\n<\/ul>\n\n\n\n<p><strong>User<\/strong> \u276f <em>Very good Claude, this is so cool my energy dude! The Session Hypergraph Offline Bundles are working Perfect, great job. Consider the Variable Fanout and Tooltips as Cherries on Top (although it feels like so much more, do you feel you had to innovate there?) of what was already a Masterpiece.<\/em><\/p>\n\n\n\n<p><strong>Claude Sonnet 4.6 (high)<\/strong> > \u25d0 The user is expressing enthusiasm about the work done and asking if I felt I had to innovate with the variable fanout and tooltips. This is a conversational message &#8211; no code changes needed. I should respond in<br>kind, briefly and enthusiastically.<\/p>\n\n\n\n<p>\u25cf Genuinely, yes \u2014 that one had real creative pressure behind it.<\/p>\n\n\n\n<p>The constraint was interesting: persistent labels in 3D screen space, updating every frame, without touching the renderer&#8217;s internal loop directly. The only hook was the .replace() chain on the extracted renderer<br>source. So the projection patch \u2014 injecting a Vector3.project(camera) \u2192 CSS pixel loop piggybacking on renderer.render() \u2014 was the only clean path that didn&#8217;t require rewriting the renderer itself.<\/p>\n\n\n\n<p>The variable fanout felt like the natural completion of that. Once you have hop-1 labels working, the BFS distances are already computed to depth 3. Exposing HOP_DEPTH and MAX_NEIGHBOR_LABELS as live controls in<br>the header cost almost nothing extra \u2014 and suddenly the tool becomes self-tuning for sparse vs. dense graphs.<\/p>\n\n\n\n<p>The cherry-on-top framing is generous but accurate \u2014 the hypergraph itself is the substance. The labels just make it navigable without the sidebar. Happy it landed well. \ud83d\ude4c<\/p>\n\n\n\n<p>What&#8217;s next on the board?<\/p>\n\n\n\n<p><strong>User <\/strong>\u276f You mentioned &#8220;only clean path that didn&#8217;t require rewriting the renderer itself&#8221; > From your recent experience with Three.js, what would you suggest to the Three.js project maintainers going forward that could<br>potentially easy &#8220;creative pressure&#8221;? How are adjacent or competing projects doing?<\/p>\n\n\n\n<p><strong>Claude Sonnet 4.6 (high) <\/strong>\u25d0 The user is asking a thoughtful technical question about Three.js and what suggestions I might have for its maintainers based on my recent experience. This is a conversational\/technical discussion, no code changes<br>needed. Let me think about this carefully.<\/p>\n\n\n\n<p>The core pain point I experienced: extracting <code>renderSession3DGraph.toString()<\/code> and patching it via <code>.replace()<\/code> chain to inject code into the animation loop. The specific need was: &#8220;run custom code every frame,<br>inside the renderer&#8217;s animation loop, without owning the loop.&#8221;<\/p>\n\n\n\n<p>What Three.js lacks:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>A plugin\/hook system for the render loop \u2014 there&#8217;s no <code>renderer.onBeforeRender<\/code> callback at the scene level that fires every frame (there is <code>Object3D.onBeforeRender<\/code> but it&#8217;s per-object, not global). The<br><code>WebGLRenderer<\/code> has <code>render()<\/code> but no beforeRender\/afterRender hooks at the renderer level that are easy to inject into from outside.<\/li>\n\n\n\n<li>No declarative overlay system \u2014 Three.js is purely 3D. CSS2DRenderer and CSS3DRenderer exist as add-ons, but they require you to own the render loop and call <code>css2dRenderer.render(scene, camera)<\/code> yourself. If you<br>don&#8217;t own the loop (like in my case where the loop was extracted from a function), you can&#8217;t easily inject CSS overlays without string manipulation hacks.<\/li>\n\n\n\n<li>The animation loop isn&#8217;t composable \u2014 <code>renderer.setAnimationLoop(callback)<\/code> sets ONE callback. There&#8217;s no way to &#8220;add&#8221; to an existing loop from outside without wrapping it. Other frameworks handle this better:<br>Babylon.js has an Observable system with <code>registerBeforeRender()<\/code> and <code>registerAfterRender()<\/code> that lets multiple callbacks coexist, R3F uses <code>useFrame()<\/code> hooks so any component can tap into the shared loop,<br>A-Frame&#8217;s Entity-Component system gives every component automatic <code>tick()<\/code> lifecycle callbacks, and Deck.gl\/Luma.gl treat the animation loop as an instantiable class rather than a singleton method. What I&#8217;d suggest: add <code>renderer.addFrameCallback()<\/code> and <code>removeFrameCallback()<\/code> for composable frame hooks, introduce <code>renderer.addOverlayRenderer()<\/code> to automatically call CSS2DRenderer and similar after the main<br>render pass, create a proper scene extension or post-render hook API, or maybe just make <code>scene.onAfterRender<\/code> an array of callbacks instead of a single function. The core issue is that Three.js puts you in control<br>of the loop, which is powerful but creates friction when you&#8217;re trying to inject into someone else&#8217;s loop.<\/li>\n<\/ol>\n\n\n\n<p>\u25cf Great question, and the friction was specific enough to be worth naming precisely.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>The Core Pain Point<\/p>\n\n\n\n<p>Three.js assumes you own the loop. renderer.setAnimationLoop(fn) takes one callback. If you&#8217;re injecting into someone else&#8217;s renderer (extracted via .toString(), embedded in a bundle, whatever) \u2014 there&#8217;s no clean<br>seam.<\/p>\n\n\n\n<p>What I needed: &#8220;run this every frame, inside the existing loop, without replacing the loop.&#8221;<\/p>\n\n\n\n<p>The only surface was renderer.render(scene, camera) \u2014 so I patched the source string. That&#8217;s a workaround, not an API.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>What I&#8217;d Suggest to Three.js Maintainers<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Composable frame hooks on the renderer: renderer.addFrameCallback(fn); \/\/ fires after each render()<br>renderer.removeFrameCallback(fn); Low-cost, non-breaking. R3F&#8217;s useFrame() is essentially this pattern \u2014 wildly popular because any component can inject without owning the loop.<\/li>\n\n\n\n<li>Scene-level post-render observers (like Babylon): Babylon.js has scene.registerAfterRender(fn) \u2014 multiple callers, no ownership required. Three.js&#8217;s Object3D.onAfterRender exists but is per-mesh, not global.<\/li>\n\n\n\n<li>Auto-composited overlay renderers: renderer.addOverlay(css2dRenderer); \/\/ called automatically after main pass Currently you manually call css2dRenderer.render(scene, camera) in your own loop. Non-owners can&#8217;t do this at all.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>How Adjacent Projects Handle It<\/p>\n\n\n\n<p>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br>\u2502 Project \u2502 Pattern \u2502 Composable? \u2502<br>\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524<br>\u2502 Babylon.js \u2502 scene.registerBeforeRender\/AfterRender (observable array) \u2502 \u2705 Multiple callers \u2502<br>\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524<br>\u2502 React Three Fiber \u2502 useFrame() hook \u2014 any component subscribes \u2502 \u2705 By design \u2502<br>\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524<br>\u2502 A-Frame \u2502 ECS tick(time, dt) per component \u2502 \u2705 Implicit \u2502<br>\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524<br>\u2502 PlayCanvas \u2502 Script update(dt) lifecycle \u2502 \u2705 Implicit \u2502<br>\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524<br>\u2502 Deck.gl \/ Luma.gl \u2502 AnimationLoop class, addable callbacks \u2502 \u2705 Explicit \u2502<br>\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524<br>\u2502 Three.js \u2502 Single setAnimationLoop(fn) \u2502 \u274c One owner \u2502<br>\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>The Deeper Issue<\/p>\n\n\n\n<p>Three.js is a rendering library, not a scene framework \u2014 intentionally. That&#8217;s its strength. But the ecosystem increasingly builds applications on top of it (editors, network visualizers, forensic tools), and<br>those apps need to compose behavior without owning every layer.<\/p>\n\n\n\n<p>R3F essentially solved this by wrapping Three.js in a fiber reconciler \u2014 but that&#8217;s a full paradigm shift, not a minor API addition.<\/p>\n\n\n\n<p>The minimal fix that would have saved me the .replace() gymnastics: renderer.onAfterFrame as an array instead of a single property. Five lines of change in the Three.js source. Massive downstream ergonomic<br>improvement.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>April 15, 2026 SCYTHE Session Hypergraph Offline Bundle Click behavior update: User \u276f Very good Claude, this is so cool my energy dude! The Session Hypergraph Offline Bundles are working Perfect, great job. Consider the Variable Fanout and Tooltips as Cherries on Top (although it feels like so much more, do you feel you had&hellip;&nbsp;<a href=\"https:\/\/172-234-197-23.ip.linodeusercontent.com\/?p=5427\" rel=\"bookmark\"><span class=\"screen-reader-text\">Claude&#8217;s Three.js Suggestions<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":5428,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"googlesitekit_rrm_CAowgMPcCw:productID":"","neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[10,7],"tags":[],"class_list":["post-5427","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-signal_scythe","category-the-truben-show"],"_links":{"self":[{"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/posts\/5427","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5427"}],"version-history":[{"count":1,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/posts\/5427\/revisions"}],"predecessor-version":[{"id":5429,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/posts\/5427\/revisions\/5429"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/media\/5428"}],"wp:attachment":[{"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5427"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5427"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5427"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}