Repository navigation
Releases
Releases · macedonga/visor-kit
Visor Development Kit 0.1.1
Changed
- The TypeScript client is published to npm by trusted publishing from this repository's release workflow, with a
provenance statement, and no token. - Each release also puts a copy of the libraries and of the TypeScript client on GitHub Packages, so the repository
lists them. Maven Central, npmjs.com and PyPI stay the places to install from. - The docs moved to visor.macedonga.com, and they name the first Visor with the VDK: Visor 3.0.0.
- The
visorcommand installs with one line, from visor.macedonga.com/install.sh or install.ps1.
Visor Development Kit 0.1.0
Added
kit-protocol: the wire contract, protocol version 1, with its OpenRPC document.kit:Visor.connect, the glasses' status, photos and videos, the captures on the glasses and their import,
the Neural Band's status, gestures and vibration, and the Display's teleprompter.RequestScopesasks the
person for scopes on Visor's consent screen, where they may allow them only this time.glasses.inputs, with theinputsscope: each touch of the touchpad and each press of a button, and on the
Display DAT's navigation (nav, select, back, drags) from the touchpad and the band, with a sources filter and
keepBack.glasses.motion, with themotionscope: the accelerometer, gyroscope, magnetometer and orientation at 5 to 60
samples a second. Visor reads them from the glasses' own sensor service, with nothing on their screen, and fuses
the orientation on the phone.band.motion, with themotionscope: the Neural Band's accelerometer, gyroscope, magnetometer and orientation
on the wrist, for a band the person shares with the phone.BandStatus.sharedsays when the band is shared: then
band.gesturescome straight from it andband.buzzgoes out at once, while the Display reaches the band through
the phone. FakeBand plays both (shared,motion), and the fake console hasband-sharedandband-motion.- The VDK in the Display's web apps: the TypeScript client's
Visor.connectGlasses()reaches Visor through the
Display browser's Bluetooth scans, for the web apps the person allows in Visor, and fails withrefused, reason
not_allowed, until they do.Visor.over(transport)takes any otherTransport. A web app's WebMCP tools reach
the person's own model through Visor once they turn that on. display.cards.setanddisplay.cards.remove: an app's own cards on the Display home's Briefing, beside Meta's
weather and sports, kept until the app removes them, each with an optionaldetailthat a click opens full
screen, or pages the wearer swipes through. FakeVisor keeps them infake.display.cards.- Layouts look like Meta's own cards: the
titletext style, any colour (LayoutColor.rgb),maxLinesand text
align, iconcolorandsize, boxbackgroundandheight,pin*to place an element over the others, a
pagerof pages with dots, andchart(a line or bars, drawn by Visor on the phone). The building blocks
header,stat,change,fieldandprogress; Meta's Briefing glyphs and its 14 weather illustrations in
LayoutIconName. image(bitmap)on Android: a photo from the app inside a layout or a card, scaled to the Display. Visor scales
data:images larger than 600 px a side. A card and its detail take at most 256 KiB (BriefingCard.MAX_BYTES),
checked by the client, Visor and FakeVisor alike.display.cards.keep: a card that follows aFlowof the app's state. While an app has cards on the Briefing,
the Display asks for it every 15 seconds.- Python
visor_kit.layoutand TypeScriptvisor-kit/layout: layouts and Briefing cards with the Kotlin builder's
pieces and blocks;image_file(path)in Python. display.cards.clicks: clicks on buttons and boxes in a card's detail reach the card's app;toaston the
element confirms one on the Display. FakeVisor:fake.display.clickCard(card, id).- The Display simulator shows the Briefing with the app's cards and opens their details; kit-testing has
fake.display.briefingPreview(context). Thevisorcommand:card FILE,call METHOD @FILEand-for
standard input,--fake=PORT, and an error that names the port and the cause when no fake answers. voice.transcriptson the Meta Ray-Ban Display, which is no headset to the phone: the Display's own speech
recognition through Meta's toolkit app, as DAT's speech, with a Listening screen naming the app when it shows no
layout.- Docs: Briefing cards, a guide with recipes (weather, a stocks watchlist, a live timer
with buttons, photos) that the Android sample runs. kit-testingserves FakeVisor's imported captures and live photos to the app under test, with the bytes the
test gives them:fake.glasses.add(type, bytes, mime),fake.live.photo(bytes, mime).voice.speak, with thevoicescope: the glasses say a line in their own voice, unasked. On the Display;
FakeVisor keeps what was said infake.voice.spoken.- Videos in layouts on the Display, with
display.video:starting,playing,ended,failed. glasses.inputson the Display: while a layout shows,nav_*,select,backand drags withx,y,dx
anddy, as DAT gives them.band.gesturesleaves the band on the Display: the gestures come through a session with it, andderivedcarries
the same gesture asaction.display.layout.show,display.layout.closeanddisplay.layout.clicks: layouts with DAT's elements (columns
and rows, text, images, the Display's own icons, buttons, button bars and a video) and their styles, with clicks
back.display.layout.statesays when the layout goes and why, anddisplay.videofollows the video. Visor
shows them through Meta's toolkit app on the Display, videos aside; FakeVisor serves everything.VoiceLaunch: an app that is not running is started by a phrase its activity declares, as DAT's voice
invocations start one, and answers withvoice.reply.voice.transcripts, with themicrophonescope: what the glasses hear, as text, from the phone's recogniser,
with its confidence, and the text so far while the wearer speaks when the app asks for partials.
The client binds withBIND_INCLUDE_CAPABILITIES, so Visor may record while the app is on screen.- Feeds, streams of binary records, over a socket for apps and as Base64 events over JSON-RPC.
camera.live
streams the glasses' camera, encoded, with their microphones when asked;LiveVideoDecoderand
LiveAudioDecoderdecode it to a Surface, to images or to PCM.camera.live.phototakes a photo meanwhile. kit-testing:FakeVisor, Visor in the app's own process, withFakeLivefor the live camera.- The
visorcommand: call any method, watch any topic, trace an app's traffic, simulate the band or the glasses
and inject events, and grant scopes, from a computer through adb.visor livesaves or plays the camera live. visor fake: FakeVisor on a computer, on the network door's WebSocket and MCP endpoints and forvisor --fake,
with a console that plays the glasses. The Python client'sconnect_fake()and the TypeScript client's
Visor.connectFake()reach it.- AI tools:
visor docssearches the docs,visor docs-mcpserves them to coding assistants over MCP,visor agentsprints guidance to save as AGENTS.md, a Claude Code plugin with skills, anddocs/llms.txt. kit-fake: FakeVisor in plain Kotlin, andkit-server: the server engine, both for the JVM.- FakeVisor plays DAT's motion CSV (
playMotion) and a recorded H.264 or H.265 stream as the live camera
(FakeLive.play);visor fakehasmotion-csvandcamerafor them. settings.list,settings.get,settings.setandsettings.changes, with thesettingsscope: the glasses'
settings with their labels, choices and ranges, and changes to the everyday ones.assistant.turnsandassistant.history, with theconversationsscope: what the wearer asks the assistant
and its answers, as they come and from the history Visor keeps on the phone.- Python client:
open()subscribes before the app acts and returns aStream. Python samples in
samples/python: a prompter pager, an assistant journal and a settings tool. samples/web: a console for the glasses in one page, on JSON-RPC over WebSocket.visor recordsaves topics' events as JSON lines, andvisor replayplays them into the apps at their pace,
on a phone or onvisor fake.FakeVisor.replayplays them in JVM tests.