[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-94009":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":15,"stars7d":15,"stars30d":15,"stars90d":14,"forks30d":14,"starsTrendScore":16,"compositeScore":17,"rankGlobal":9,"rankLanguage":9,"license":18,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":19,"hasPages":19,"topics":21,"createdAt":9,"pushedAt":9,"updatedAt":22,"readmeContent":23,"aiSummary":9,"trendingCount":14,"starSnapshotCount":14,"syncStatus":24,"lastSyncTime":25,"discoverSource":26},94009,"TheLongSilence","achimala\u002FTheLongSilence","achimala","A space exploration game built by Claude Opus 5",null,"JavaScript",321,44,1,0,177,531,94.9,"MIT License",false,"main",[],"2026-07-30 04:02:14","# THE LONG SILENCE\n\nA procedural space-exploration game that runs in a browser tab. WebGL2, no\nassets — every star, world, ring system, nebula and derelict is generated from\na seed and shaded by hand-written GLSL.\n\n```\nnpm install\nnpm run dev        # http:\u002F\u002Flocalhost:5173\nnpm run build      # static bundle in dist\u002F\n```\n\n---\n\n## The game\n\nForty thousand years ago nine hundred inhabited worlds inside an eighty\nlight-year volume fell silent in four days. No debris, no radiation signature,\nno sign of violence. The Choir left their cities lit, their orbits tidy, their\narchives open — and seven instruments standing in seven systems.\n\nYou fly the survey vessel *Pale Seeker*. Chart systems, scan what you find,\nand attune to the Resonators; each one yields a Canto and pushes the drive a\nlittle further. All seven opens the Aperture.\n\n### Controls\n\n| | Desktop | Touch |\n|---|---|---|\n| Steer | mouse (click to capture) or arrow keys | left stick |\n| Roll | `Q` \u002F `E` | right stick, horizontal |\n| Throttle | `W` \u002F `S`, or scroll | right stick vertical, or `+` \u002F `−` |\n| Boost | `Shift` | `BST` |\n| Scan | hold `F` | hold `SCAN` |\n| Land \u002F lift off | `L` | — |\n| Fold drive | `J` | `FOLD` |\n| Star map | `M` | `MAP` |\n| Archive | `Tab` | `ARC` |\n| Full stop | `X` | — |\n| Camera | `V` | — |\n| Frame stats | `P` | — |\n\nFold speed scales with distance from the nearest mass, so an approach\ndecelerates itself and drops you out just clear of the surface. Interstellar\ntransit is initiated from the star map and costs drive charge by distance.\n\n---\n\n## How it renders\n\n**Scale and precision.** One world unit is one kilometre. Systems span millions\nof units while the ship is 0.1 units long, so the world uses a *floating\norigin* — the ship sits at (0,0,0) and everything else is positioned relative\nto it each frame — plus a logarithmic depth buffer. Custom `ShaderMaterial`s\nopt into log depth by hand (`LOGD_*` chunks in `src\u002Fgfx\u002Fglsl\u002Fnoise.js`); miss\nthat and two concentric spheres z-fight into triangular confetti.\n\n**Planets are baked, not evaluated.** Twenty-odd octaves of simplex per pixel\nper frame is not survivable on a phone, so each solid world is rendered once\ninto a cubemap holding linear albedo in RGB and terrain height in A. The\nruntime shader is three texture taps for normals plus lighting. Cubemaps rather\nthan equirectangular maps: no pole pinch, no seam. The nearest world gets\nre-baked at 1024²\u002Fface; everything else sits at 256².\n\n**Atmospheres are single-scattering raymarches** through a spherical shell in\nplanet-radius object space, with Rayleigh coefficients set from real optical\ndepths (~0.05\u002F0.10\u002F0.23 at zenith) and a soft planetary penumbra on the light\nray so twilight fades instead of ending at a line.\n\n**Auto exposure** runs entirely on the GPU: a 64² luminance reduction to 8² to\n1², then a ping-pong adaptation target. The metric is a *sqrt* mean — a log\nmean is the textbook choice but space frames are 90% black sky and the log of\nnear-zero drags the average to nothing, blowing out every shot.\n\n**Post** is hand-rolled: bright prefilter → six-level dual-filter bloom with\nattenuated wide mips → anamorphic streak → god rays and lens ghosts → composite\n(radial blur, chromatic aberration inside the sampler, AgX tonemap, grain,\ndither) → FXAA.\n\n**Performance** holds 60fps by trading resolution, never features: the engine\nwatches frame time and moves the render scale between 0.62× and 2×.\n\n---\n\n## Layout\n\n```\nsrc\u002F\n  core\u002F       Engine (renderer, quality tiers, frame loop), Input\n  gfx\u002F        PostFX, Sky (nebula cubemap + HDR star field), cube baking,\n              greeble (the shared construction + surfacing kit), GLSL\n  world\u002F      generate (seeded universe), Planet, Star, Surface (the ground),\n              Fleet (traffic), Station, Structures, Asteroids, Dust, shaders\n  ship\u002F       Ship — procedural hull with injected panel-line PBR, flight model\n  game\u002F       Game (world state, scanning, fold, floating origin), Director\n              (cutscenes), encounters, lore\n  ui\u002F         HUD, Codex, StarMap, stylesheet\n  audio\u002F      procedural WebAudio drone and engine\ntools\u002F        browser verification: survey.mjs, play.mjs, probe.mjs, sheet.mjs\n```\n\n**One kit builds everything.** `gfx\u002Fgreeble.js` owns the plate-seam law, the\nweathering, the sun-bleaching, the grazing rim term and the five base materials,\nand the player's hull, every freighter, every station and every derelict are\nsurfaced by it. Parts bake their transforms into their geometry and are welded\nper material, so panel lines run continuously across part boundaries and a\nhundred pieces cost six draws.\n\n**Traffic is on a schedule, not a simulation.** Craft follow analytic paths\nkeyed to the clock, so they are exactly where they belong after a fold jump or a\ntwo-minute pause. Each carries a *beacon* — a quad sized from view depth to hold\na constant few pixels — because sixty metres of hull four million kilometres\naway is far below one, and a moving spark is what makes a system read as busy.\n\n**The ground is a separate scene.** Orbit needs a whole planet with no visible\ngeometry; standing on one needs ten kilometres of terrain with no visible\nsphere. `world\u002FSurface.js` is a radial grid whose rings grow exponentially,\ndisplaced by the same terrain law the orbital bake uses, bent down by the\nplanet's real radius, and hazed by the same scattering coefficients as the\natmosphere shell above it.\n\n## Verification\n\n```\nnode tools\u002Fplay.mjs        # 17 interaction assertions (flight, scan, fold, jump)\nnode tools\u002Fsurvey.mjs      # screenshots every set-piece, reports fps\u002Fdraws\nnode tools\u002Fprobe.mjs \"\u003Cjs>\" --shot out.png     # one expression, one frame\nnode tools\u002Fsheet.mjs a.png b.png --out s.png   # contact sheet — judge a set at once\nnode tools\u002Flevels.mjs shots\u002F*.png              # tone statistics per frame\nnode tools\u002Fjudgeset.mjs                        # rebuild the review set in shots\u002Fjudge\u002F\n```\n\n`levels.mjs` is the one that stops arguments. \"It looks flat\" is not\nactionable; \"0.00% of pixels clip and the 99th percentile is 165\" is, and that\nis exactly what the game measured before the highlight range was fixed.\n\nEvery tool boots through `tools\u002Fboot.mjs`, which exists because the dev server\nhot-reloads on any source edit: a capture that started before the reload\nfinishes happily and screenshots the title card, with a plausible frame rate\nprinted next to it. It verifies the overlay is actually gone and starts over if\nit is not, and the multi-shot tools re-check between shots.\n\nPhones are turned away at the door with a short message rather than served a\nreduced build — every feature worth looking at here is one a handset cannot\nafford, and a bad first impression is worse than none.\n\nBoth drive a real headed Chromium with GPU rasterisation against `npm run dev`.\n",2,"2026-07-29 02:30:07","CREATED_QUERY"]