Skip to content

History

Revisions

  • docs(wiki): a signpost Home page and a curated sidebar Home was still the auto-generated one-line stub, which reads as abandoned to the one visitor the wiki actually gets: someone already on the repo who clicked the Wiki tab. It cannot be deleted - GitHub recreates it as the wiki's landing page - so the choice was only ever what it says. It now carries: what this wiki is and how it relates to gps.csutil.com/blog, an explicit drafts warning (GitHub hides the status field, so a visitor cannot otherwise tell these are drafts), four entry points chosen by reader intent rather than by topic, and where to send a correction. _Sidebar.md puts six themed groups on every page. Deliberately a subset - eighteen of thirty - since GitHub's own page list already enumerates everything; what it cannot do is say where to start. Sized at one screen each on purpose: GitHub serves this wiki with x-robots-tag: none, so it earns no search traffic and is worth investing in only for readers who are already here. Search indexing needs 500+ stars per GitHub's documented rule; this repo has 2.

    @cs-util cs-util committed Aug 20, 2026
    b7dffb2
  • fix(blog): links, edit seams, and errors in my own corrections Three cold reviews. The largest finding was that all thirty articles contained three outbound links between them - none to the repo, npm or any demo, and none to each other despite a dozen prose cross-references. A reader convinced by an article had nowhere to go. Fixed with links to the deployed demos, the repo, npm, and the articles that prose already pointed at. A re-verification pass found real errors in yesterday's corrections, which is the more useful half: - The convergence checkpoints are measured in OBSERVATIONS, not seconds. My "double-digit metres at twenty seconds" was wrong: at ~40 observations, which is roughly twenty seconds, the median is about 7 m. Corrected in the one article whose stated point is publishing the uncomfortable number. - The permission count. My retitle to "four dialogs" was wrong on the only platform that runs this: the motion prompt is iOS-only and iOS does not expose WebXR AR at all. The article no longer hard-codes a count. - The framework DOES route the probe outcome into distinct messages; only one helper is narrow. My correction generalised a function-scoped gap into a framework-scoped accusation. - The on-screen first-placement exemption applies only to anchors created with bootstrapping skipped, not to every anchor's first placement. - Planar PnP disambiguates by reprojection error alone - there is no temporal tiebreak, which is why the flicker it describes can still occur. - QR size precedence is the opposite of what I wrote: an authored size WINS and the depth measurement is the fallback. - A float32 step at earth radius is half a metre, not 0.4 - the 0.38 figure is relative precision, not a step. - The 30 fps camera-delivery figure is measured nowhere; replaced with the distinction that actually matters (render rate is not sensor rate). Editorial seams from the correction pass: a heading swap orphaned "the opposite of what?", a "general lesson" section that had grown a second lesson, a bolded claim retracted four lines below itself, an inserted paragraph that broke the bold-led list it landed in, and two descriptions still describing titles that had changed.

    @cs-util cs-util committed Aug 20, 2026
    2d84465
  • fix(blog): the blur gate with its real numbers, and the rest of the fact-check The blur-gate article now publishes the measurement instead of asserting a benefit: 156 hand-labelled frames from one indoor session, four metrics compared, a threshold sweep replayed through the real gate. The headline finding is a negative one and it is the most useful part - no metric separates cleanly, every AUC below 0.9, so there is no threshold that keeps the good frames and drops the bad ones. k=0.5 rejects 7% and never rejected a sharp frame but catches only a fifth of the blurry ones; k=0.8 rejects 30% at ~0.98 precision and catches 59%. The default is now enabled at 0.8 per the owner's decision, and the article states plainly what was NOT measured: whether the retry produces a better frame, and anything at all about outdoor scenes. COLMAP: the export is posed, not georeferenced, and the article says so. It also now carries the constraint that would bite anyone who tried - do not export earth-centred coordinates, because splat trainers store geometry in float32 and one step at earth radius is ~0.4 m. PWA: the article is retitled "Shipping AR as static files" and the offline claims are split - the computation genuinely has no server to be offline from, the page has no service worker yet. Also corrected against the code: capabilityMessage returns ONE templated sentence and never sees the probe outcome, so the article's four-message design is now described as absent rather than shipped; the Chromium workaround is unconditional, not version-scoped; the permission order is AR essentials then camera then orientation then geolocation LAST, which is the opposite of what the article recommended and was decided by field testing; HUD elements must be DOM DESCENDANTS of the overlay root, which is a nesting rule and not a z-index one; the physics demo collides against a trimesh, not the AABB list; the AR layer is a module singleton rather than an injected seam; the QR demo does not replay recordings; H3 has twelve pentagons per resolution; and the retry-after-timeout advice no longer promises it works. The "fifteen seconds" rule of thumb is gone from every article, replaced where relevant by the corpus measurement it contradicts: a median of about two minutes across 51 recordings.

    @cs-util cs-util committed Aug 20, 2026
    ed30eaf
  • fix(blog): the QR family, as tested parts rather than a shipped feature Per the owner's decision, the marker-anchoring articles now say plainly what is true: detection, the pose solver, size-from-depth, the stability window and the vote builder exist and are tested, and no app wires them together - the QR demo is deliberately geo-less and casts no GPS vote. Four articles leaned on the assembled capability; each now offers the parts and says the assembly is yours. The plausibility check was described as something better than it is. It takes the marker's centre POINT, not its pose, so it cannot compare the marker's plane against the wall - which means it does not catch the two-fold ambiguity flip, the exact failure the article credited it with. And it does not use voxel ray traversal; that exists but carves free space into the occupancy grid instead. The article's real thesis - a second sensor is worth more for detecting contradictions than for reducing noise - survives intact. The detection scheduler is fixed-rate with no mode switch, so the adaptive search/tracking/idle rates are now the argument for having a scheduler object rather than a description of one. Also corrected: the quality gate is not in front of the detector today, and the camera does not hand you sixty usable frames a second. Smaller: VPS accuracy is decimetre-class not centimetre; VPS coverage is large and growing rather than "increasingly not much else"; iOS does not expose WebXR AR, so ARKit is the native counterpart rather than a runtime this reaches; the QR size field still exists and is honoured, so measurement makes it optional rather than absent; and "fifteen seconds" no longer appears as a fact anywhere.

    @cs-util cs-util committed Aug 20, 2026
    4d7cf8d
  • fix(blog): correct the scene-graph inversion and the removed anchor bypass The fact-check found five articles stating things that are the inverse of what the code does. All five share one root cause and it was ours: the framework README described a large-jump bypass that gps-anchor.ts.md records as REMOVED in June, and it describes the scene graph in a way three articles then paraphrased backwards. The scene-graph correction is the one a developer would have acted on. The scene ROOT is GPS-aligned world space and arWorldGroup - which holds the camera - is a group inside it carrying the alignment. So an object at the scene root keeps its world pose perfectly and appears to float, because the camera moves under corrections while it stands still; an object at a fixed transform inside the group stays visually nailed down and drifts in GPS; and createGpsAnchor lives inside the group but re-derives its local position each tick, which is how it gets both. The articles had the first two swapped, and described the minimal example's "floater" as the local one when it is in fact the world-correct one. The anchor correction replaces an invented rule with the real reason: there is no large-correction escape hatch, because smoothing lives once on the group's lerped matrix, so a big alignment change is already eased across the whole view before per-anchor logic runs. A per-anchor on-screen snap did not rescue anything - it manufactured the hard jump the shared lerp existed to remove. Also corrected: the median bootstrap only rejects multipath when the caller supplies a GPS sampler, since the default derives from the object's own pose; and the "fifteen seconds" rule of thumb no longer appears as a fact.

    @cs-util cs-util committed Aug 20, 2026
    8058d6c
  • docs(blog): the first batch of thirty drafts Every page is gated at `status: draft` - the site build renders only pages marked published, and an unrecognised or missing status renders as draft. Nothing here reaches gps.csutil.com/blog/ until a marker is flipped. The first three (why-outdoor-webxr-drifts, gps-is-a-distribution-not-a- position, what-you-give-up-by-not-using-a-vps) are the style probe: written first, deliberately different in register, so an edit pass has an obvious entry point and the corrections can propagate to the other 27. Topics and the suggested publication order are in the private docs repo's 2026-08-20-0812-marketing-content-backlog.md. Verified against the real renderer: 31 files in, 0 published, 31 withheld, each with a reason.

    @cs-util cs-util committed Aug 20, 2026
    758ba8a
  • Initial Home page

    @cs-util cs-util committed Aug 20, 2026
    6f1c401