Commit Graph
25 Commits
Author SHA1 Message Date
Andy Dixon 76c846fdce Walk and fly through the city
Adds walk and fly cameras alongside the helicopter view, switched with
1/2/3 or the city toolbar. Walking uses mouse-look with pointer lock
(or drag), WASD, Shift to run and circle-vs-footprint collision with
sub-stepping so long frames cannot tunnel through buildings; flying
follows the view pitch with Space/C for altitude and clears low roofs.
Double-clicking a street drops you there with an animated descent,
facing the longest open street. A crosshair names the building ahead
(E or click inspects it), the address bar shows the folder you are in,
and a minimap shows your heading and teleports on click.
2026-05-23 14:33:00 +01:00
Andy Dixon 3036763d08 Show blank source lines as blank
highlightSource returns a 'No preview available' placeholder for empty
input, so every empty line in the source viewer showed that text.
2026-05-10 18:11:36 +01:00
Andy Dixon ae8b0a6b80 Add City mode: codebase laid out as streets and buildings
city.js lays the directory tree out at human scale: top-level folders
become districts separated by 18 m avenues, nested folders become
blocks with narrower streets and raised pavements, and files become
buildings whose footprint follows their lines and whose height follows
their complexity. The squarified treemap moves into city.js and is
shared with the landscape.

The renderer gains a second instance layer with per-instance kind,
code-atlas rectangle and selection flag, a helicopter camera in metres,
screen-to-world rays, and geometry lookup per mode. City mode supports
orbit, pan, dolly, ray picking, focusing a building and district names.
Node tests cover layout invariants, heights, ray/box hits and the
spatial index.
2026-05-10 15:50:23 +01:00
Andy Dixon eae93d93dc Render 3D through a real perspective camera
Adds camera.js with perspective, lookAt and matrix helpers. The orbit
view is now a lookAt pose feeding one view-projection matrix shared by
the shaders and project(), replacing the hand-rolled projection with
its clamped depth. A node test checks the new camera reproduces the old
projection to within 0.05 px, so the landscape looks the same; this is
the base the city's walk and fly cameras need (near plane, correct w).
2026-05-03 09:41:31 +01:00
Andy Dixon 94577118a4 Remove the GitHub link from the toolbar 2026-05-02 20:58:54 +01:00
Andy Dixon e7627c8877 Texture 3D roofs on the GPU and draw the grid in WebGL
The overlay used to clip and affine-map a code texture onto every
visible roof and punch every roof out of a 2D ground grid each frame
(about 13,600 saves and 6,800 clips per frame on a 1,676-file repo).

The existing code overview canvas already matches the world layout, so
it is uploaded once as a mipmapped texture and sampled by the roof
shader. The overlay now only draws sharper text for the few roofs close
enough to magnify that texture, and the grid is a WebGL line pass. The
vertex shader emits a real clip-space w so the texture is perspective-
correct; screen positions are unchanged. JS and canvas time per 3D
frame fell from 284 ms to 27 ms in the same profile.
2026-05-02 14:44:09 +01:00
Andy Dixon e39af39eca Cache viewport size and camera trig in 3D projection
project() read canvas.clientWidth/clientHeight on every call, and it
runs for every tile corner each frame. Profiling a 1,676-file repo put
216 ms of each 3D frame in project(); with the size cached per frame
and the trigonometry per camera change it drops to about 7 ms.
2026-04-18 13:02:40 +01:00
Andy Dixon de3dbf8601 Redesign the interface
Deep blue-black theme with a violet-to-cyan accent, frosted floating
panels, self-hosted Inter, a welcome screen with a call to action, a
card-style inspector, accent tabs and toggles, animated progress, and
a restyled open dialog. In 3D the WebGL walls are now lit per side
with a darker foot so buildings read as solids, and the canvas clears
to transparent over the new background. Renamed to CodeNavigator.
2026-04-12 15:04:26 +01:00
Andy Dixon 186f99f436 Start map drags only on the canvas
The viewport's pointerdown handler captured every press inside it,
including presses on floating buttons, so the resulting click could be
retargeted to the viewport and never reach the button.
2026-04-11 13:58:36 +01:00
Andy Dixon 361ecde158 Fix every failed clone being reported as a timeout
The context was cancelled before its error was checked, so any failure
looked like a timeout and private repositories never offered sign-in.
Clone handling moves into cloneRepo, which checks for DeadlineExceeded
specifically, with tests for success, failure with token masking, and
timeout.
2026-04-05 12:44:17 +01:00
Andy Dixon e744ebab1f Time out stalled GitHub clones after ten minutes
Progress streams now stay open until a job ends, so a hung clone would
otherwise hold its job and stream forever.
2026-04-04 11:53:50 +01:00
Andy Dixon 841f27487a Keep progress streams open until the job finishes
The stream used to close after three minutes, which a job queued behind
other users could exceed. It now runs until the job completes or the
client disconnects, sending a keep-alive comment every 15 seconds so
nginx does not time out an idle stream.
2026-03-21 12:35:13 +00:00
Andy Dixon 957c6404c1 Document sessions, limits and GitHub App setup 2026-03-15 14:27:38 +00:00
Andy Dixon 09b57f7afa Offer GitHub sign-in in the frontend
The load dialog shows the GitHub account state with sign-in, sign-out
and repository-selection links. A clone that needs authorisation shows
a Sign in with GitHub or Grant repository access button, and the
repository is resumed automatically on return from GitHub.
2026-03-15 09:52:44 +00:00
Andy Dixon b216b86004 Add GitHub App sign-in for private repositories
/api/github/login redirects to GitHub with a single-use state bound to
the session; the callback exchanges the code for a user token kept in
memory and expired with it. Clones pass the token through git config
in the environment, never the URL or arguments, and ignore host git
config and credential helpers. Failed clones report authRequired
(signin or install) so the frontend can offer the right next step.

Configured with GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET, GITHUB_APP_SLUG.
2026-02-28 12:27:34 +00:00
Andy Dixon 25c8c45de4 Limit concurrent indexing to two runs
Further jobs report a queued phase until a slot frees, so a burst of
users cannot exhaust the container's CPU and memory at once.
2026-02-21 19:55:38 +00:00
Andy Dixon 1c93df022d Expire idle snapshots and abandoned jobs, cap snapshot count
A background sweep every minute drops snapshots unused for an hour,
finished jobs, and uploads never committed, deleting their workspaces.
At most 8 snapshots are held; the least recently used is evicted.
2026-02-21 09:37:43 +00:00
Andy Dixon 25e2d2f390 Keep one snapshot per session instead of one globally
Indexing used to discard every existing snapshot, so concurrent users
wiped out each other's landscapes. Only the same session's previous
snapshot and workspace are replaced now.
2026-02-15 18:15:47 +00:00
Andy Dixon 26800b9b66 Scope jobs and snapshots to a browser session
An HttpOnly, SameSite=Lax session cookie is issued when a job is
created. Job and snapshot routes return 404 to any other session, so
indexed source is only readable by the browser that loaded it.
2026-02-15 10:53:01 +00:00
Andy Dixon d8d4a77ba7 Use random job and snapshot IDs
Timestamp-derived IDs were guessable, and the ID is what grants access
to indexed source. crypto/rand.Text gives 26 base32 characters.
2026-02-07 12:18:26 +00:00
Andy Dixon 981ec88f43 Add Docker build script and README
Multi-stage Dockerfile runs the tests, builds a static binary, and ships
it on Alpine with git for GitHub clones.
2026-02-01 21:48:24 +00:00
Andy Dixon 59d7e99e0b Note invalid UTF-8 replacement difference 2026-02-01 15:33:38 +00:00
Andy Dixon 62c363b031 Prefilter indexer regexps with literal checks
Go's regexp backtracker dominated indexing. Each pattern now runs only
when a cheap necessary-condition check passes, cutting indexing of the
Go standard library source from 4.7s to 1.4s.
Adds BenchmarkIndexDirectory.
2026-01-25 15:57:26 +00:00
Andy Dixon 5816dea6b1 Add Go HTTP/SSE API server with embedded frontend
Implements the API routes (jobs, progress events, snapshots, search,
entities, source delivery with release) to net/http and serves the
static frontend from the same binary on the same origin.
2026-01-25 09:10:28 +00:00
Andy Dixon f040f28325 Add source indexer
Parallel file parsing, import linking, language/layer classification,
and .gitignore/.ignore handling, with tests.
2026-01-24 14:08:43 +00:00