Skip to content

Dev - #11

Merged
coder-RT merged 57 commits into
mainfrom
dev
Nov 2, 2026
Merged

Dev#11
coder-RT merged 57 commits into
mainfrom
dev

Conversation

@coder-RT

@coder-RT coder-RT commented Nov 2, 2026

Copy link
Copy Markdown
Owner

No description provided.

coder-RT and others added 30 commits November 1, 2026 02:39
Write to Rachit section before the footer; /api/contact sends through Resend so
the address stays a server variable. Same-site check, Vercel BotID (Vercel builds
only), honeypot, minimum fill time, per-visitor limit and a daily cap.
Contact link in the footer only, so the keyboard paths keep their budgets.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GET /homes/{id}/room-map?room= returns the robot export's document for the
owner's device key, with robot access on or off, and writes no robot_export
audit entry. The export's JSON building is shared with the robot route.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…p sound

Find: 'Your rooms' shows a map card per room, swiped sideways; tapping one shows
only its things. 'Your things' is grouped by room, then furniture, with Go on
every row (shared with Found). Robot Access draws the same map. Switching tabs
plays a soft tap of our own making, with a light haptic; Settings > Appearance
turns it off, and the silent switch mutes it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Find kept each room's map until the screen was rebuilt, so a rescan's map never
showed; pull to refresh cleared the maps but cards on screen didn't ask again.
A scan finishing processing now forgets the maps, and cards reload by generation.
Test: a rescan with the box and keys moved gives the room map from the rescan.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Clusters of one label that are close (0.45 m), the same colour and never in
the same photo are merged, so drift on the way back can't split one thing in
two; two things side by side stay two.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Scans shows one card per room; processed scans before the newest fold into
"Earlier scans", each saying which scan replaced or updated it, with Share and
Delete. Scans still uploading or failed keep their own card.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Same output on both stored scans (compared field by field).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each run's per-suite logs and summary go to data/test-runs/ (gitignored), with
a line in runs.jsonl and history.md. The Mac stays awake while it runs, the
simulator's status bar override is cleared first, and xcodebuild is stopped
once it has printed its verdict.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ller audit

- A thing must be seen in enough photos for the owner's level (Careful 3,
  Balanced 2, Everything 1) before the Guide, Find, room maps or robots use
  it; a confirmed thing always counts. GET/PUT /trust, kept on the Mac.
- "Not there, forget it" records a rejection; later scans drop the same
  kind of thing within 0.5 m unless it was seen in 5+ photos.
- Sightings keep their photo count (migration 0008).
- The "where is it" view and the review rule moved out of the HTTP router
  into ListThings and the domain; speech to text got its own use case.
- Audited now: scan created / uploaded / failed, every Guide question (no
  words), every transcription (no words), trust changes, and pruning.
- make demo replays at Everything, the level its replies were recorded at.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- GET /homes/{id}/robot-package: map.pgm + map.yaml (Nav2), objects.json,
  room.json, cloud.ply and a README.md, built on the Mac from the same export
  as /robot-export, with the same access rule (owner always, a robot only with
  robot access on) and the same audit entry.
- AskRequest: home_id follows the home pattern; session_id and about are
  letters, digits, _ and -, at most 64.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… build errors

- export_viewer_scan.py --public (make public-scan): every colour from height;
  no colors.bin, no photo view, drawings tinted by height and captioned so;
  each thing carries the number of photos that showed it.
- test_all.py: ONLY=<UI tests> to re-run some, and "did not build: <first
  error>" instead of 0 passed, 0 failed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…afe text fields

- Settings: how sure before Recall tells you (Careful / Balanced / Everything),
  kept on the Mac; Find shows only trusted things; Found marks "Seen once";
  the edit sheet shows the evidence (photos, SAM 3.1 score).
- Share for robots under each room map and in Robot Access: the Mac's .zip
  through the share sheet, fetched only when a place is picked.
- A rescan that didn't line up reads as "A fresh map of <room>" with what to
  do next time; Hear it again now says that instead of "nothing moved".
- Every press gives the soft tap and a soft haptic (pills, chips, rows);
  every text field keeps the Mac's limits and drops control characters; the
  home name is sent as the Mac spells it; a test checks the limits against
  the bundled spec.
- Spacing tokens on every tab; the header sits in the same place on all five
  (Settings' form margin, Devices' two-line subtitle), checked by a UI test.
- Accessibility: the map key and the not-ready map are read by VoiceOver and
  wrap at large text; UI tests use their own connection and ignore only text
  cut by the screen's edges.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… INSTALL.md

- /homes/flat/viewer shows the author's real scan (from public/real-scan/, not
  yet committed): "Real scan · not a simulation", then big sections: made by
  Meta models, measured, what SAM 3.1 found (with photos and whether Recall
  tells you), drawings, for robots, how it works, run it yourself.
  /homes/demo-flat/viewer redirects there. A test fails if any photo-derived
  file is ever published.
- The landing hero's headline: "Find your keys / glasses / wallet…", the word
  changing (Motion), one steady sentence for screen readers, still with
  reduced motion.
- INSTALL.md: three paths (website, no-keys demo, live with the iPhone), each
  step with its check and its fix, and rules for AI agents; the site serves
  the same file (a test keeps them identical) and links it from the footer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…egan

GET /homes/{id}/objects/{id}/compass-route: the same clearance-aware A* as
guidance, from the scan's first position to the thing, as legs of a magnetic
bearing and metres (north from the phone's compass during the scan). 409
no_compass / no_path / no_cloud with a reason in words. bearing() and
compass_legs() are domain functions; guidance's bearing uses the same one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rown, walked by wrist taps

- RecallWatch (watchOS 26, embedded in the iPhone app): "Hi, I'm Recall. What
  should I find?" then listens (16 kHz WAV, stops on a second of quiet), or
  the crown turns through the trusted things, saying each name. Double tap
  (handGestureShortcut) or the button: find, walk, repeat.
- Walks by compass and pedometer (CompassWalk, pure, in RecallDomain): turn
  taps (left/right patterns, faster as you get closer), an up tap when facing
  the way, a click each metre, a buzz on arrival; overshoot says stop.
- The iPhone answers the Watch (AnswerWatch use case + WatchRelay over
  WatchConnectivity): things, Muse Voice Transcribe + the Guide, compass
  routes. The Watch holds no key.
- Devices: the Watch card is Preview. test-all builds the Watch target.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… AR map

GET /homes/{id}/ar-labels?room=: each thing with its title, place, SAM 3.1
score, photos, trusted / needs_review, and its position in the ARKit frame of
the room's newest processed scan (inverse of transform_to_home), plus the
floor's height there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e scanner look

- See it in AR (Find → a room's map): recognise the room in its saved map,
  then a tag over every thing SAM 3.1 found ("GREY BAG · 88% · 5 photos"),
  a line down to it and a ring on the floor: green Recall tells you, amber
  check, red seen once. A list underneath for VoiceOver; Magic Tap says the
  label the camera points at.
- Scanning: the LiDAR points captured so far painted green on the surfaces,
  readouts (distance ahead, points, photos kept, blurry, speed, amber when too
  fast), and Camera / LiDAR (depth as heat) / Edges views.
- Core Image only (edges, false colour); no model sees the camera.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ith why and progress, measured phone height, a neon zone grid, a richer report

- Before every scan: each step with what to do, why, when it's done and how
  high to hold the phone; read aloud on request; then Start.
- During: step dots, the instruction in text, a meter ("Wall sides seen 5 of
  9"), live phone height above the measured floor (chest 1.1-1.5 m, waist
  0.8-1.1 m to sweep; a gentle reminder after 3 s out of band), distance to
  the wall on the walls step, Why?. A step that runs out of time says what was
  missed.
- Zone grid (on by default): 1 m floor columns x Recall's five height bands
  in light neon blue; zones the LiDAR has seen glow. ZONES in the readouts.
- Report: how each step went, more tiles (zones, walls, floor, points, fastest
  pace, blurry, loop, compass, light) and up to three "Next time" tips.
- Metrics carry steps, points, duration and zones (spec updated; older scans
  still decode).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rever

- The worker beats a heartbeat file every 20 s from a background thread
  (a queued task would wait behind a scan job); GET /scans/{id} reports
  worker_alive while processing (WorkerStatus port; FileHeartbeat adapter;
  always alive without a queue).
- The phone says once "Your Mac's scan worker isn't running... run make
  worker" and shows it on the scan with a Copy button; it clears when the
  worker runs again.
- Tests: heartbeat fresh / stale / damaged, the scan route, and the phone's
  say-once, clear and unknown cases.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- What finished while the app was closed (or in the background) updates the
  scan cards without being spoken; a scan finishing while the app is open is
  still announced.
- The What changed speaker is a toggle: Stop reading while it speaks
  (SpeechOutput.isSpeaking / onFinished), back when the line ends.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
torch.mps.empty_cache() off a Mac can end the process with a signal that
suppress(Exception) cannot catch. The cache release is injected into WarmModel
so its test never touches torch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PhoneLink kept every pending reply forever, so a lost reply left the Watch on
thinking. PendingReplies answers each request once: the iPhone's reply or, after
25 s, "Your iPhone didn't answer"; whichever comes second is dropped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- get_scan, get_room, mark_scan_failed and share_robot_export use cases take
  the reads, the worker's failure write, and robot access checks out of the
  routers and infra/jobs.py
- the sighting crop moves behind an ImageCropper port (Pillow adapter)
- the audit view reads through the Auditor
- util is the lowest import-linter layer and stays free of frameworks
- test_architecture.py enforces both rules with an AST scan; infra/demo.py's
  sample seeding is the one listed exception

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ec now tells the truth

Generated requests found two contract bugs, fixed here:
- protected routes returned 401 but the spec never documented it (28 operations)
- request validation errors came back as FastAPI's list, not the Error shape
  {error, detail}; /audit and /ar-labels now document their 422

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The guidance router reaches the Verifier through the port, wired in-process
(VERIFIER_TRANSPORT=inprocess, the only transport; A2A stays optional and
unbuilt), as CLAUDE.md describes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…cans, the ROS 2 example

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tches

Same behaviour as before (RecallError.status(401): "The device key is wrong"),
now that the spec lists 401 on every protected operation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ir proof, LiDAR + Meta models

- "Where did I …" ends in keys, glasses, wallet, passport, charger (Motion,
  paused off screen, still with reduced motion, one steady name for readers)
- Private · Never guesses · Voice-first, each a link to the principle card
  that says why; the card is outlined on arrival
- the scan and asking steps name the Meta models with the LiDAR

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
coder-RT and others added 27 commits November 1, 2026 22:28
…e data folder

- no device key set: every call gets 503 (was: open to anything local)
- the key is compared in constant time
- a job's log and --out must resolve under data/, like its episode
- job bodies over 64 KB get 413; malformed ones 400

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…hurt the memory

- bodies over each route's limit get 413 before they are read; the calls that
  reach a model or the pipeline are limited per key (429 with Retry-After,
  audited as rate.limited; the key is counted by its hash)
- the API listens on 127.0.0.1 unless RECALL_BIND_HOST says otherwise;
  make live / make dev pass BIND (0.0.0.0, the LAN, for the phone)
- episode zips are refused when they would unpack past 1 GB or 20,000 files
- pipeline results with NaN or infinity, or labels with control characters,
  are refused; an arrival frame that doesn't parse gets a fixed sentence
- the Makefile checks HOME_ID before it reaches SQL
- the spec documents 413 and 429; the phone names the new audit event

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…miter that forgets the oldest

- no framing, no sniffing, no plugins, quiet referrer, microphone only; no
  x-powered-by
- robots.txt keeps crawlers off local scans and /api/, not off the real scan
- the voice route refuses a declared-too-big upload before reading or counting it
- the fallback limiter drops the longest-quiet visitors instead of everyone
- privacy: scan when nobody else is in the room (people in view)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…is phone

- recall://pair shows "Pair with this Mac?" (host and a key summary) and
  changes nothing until confirmed; Cancel keeps the old Mac
- a bare host is https unless it is on this network (private IPs, .local)
- the key goes only to the paired Mac (an off-host part URL keeps its path
  only); copying it is this-phone-only for two minutes; the Keychain item
  never leaves this device
- calls give up after 30 s; the Mac's error sentence is cleaned and capped;
  a robot package over 50 MB is refused; 413 and 429 have their own words
- the camera and microphone prompts name SAM 3.1 and Muse Voice Transcribe
  (a contract test keeps them honest); no Files-app sharing of the app folder
- the spoken question's WAV is deleted after use on the phone and the Watch;
  Watch audio and replies are size-capped
- home names keep their letters (Łódź → lodz); a key cut at 128 is said;
  bidi controls are confirmed stripped; People in view in the privacy note

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s memory safe

Only what the code does today: one key on every call that touches the home,
pairing that asks first, rate limits, size checks, an append-only activity log,
no account and no Recall server. The slogan stays Private · Never guesses ·
Voice-first until the tunnel and firewall checks are confirmed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
"passport?”" and "Voice-first" at the largest text were wider than a phone and
made the page scroll sideways; both lines now wrap.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
100.64/10 and *.ts.net are encrypted by the tailnet (WireGuard) and the Mac
serves http there, so a bare Tailscale address must not become https.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nd how Muse Code tested it

- the browser tab shows the Braille R (app/icon.svg), not the Next.js icon
- docs/muse.md: each Muse model's what, why and how with code paths; Muse
  Code's three-tier agent runs (tester + reviewer, tie-breaker, synthesis;
  three security auditors), what they found, the fix commits, and the limits
- the landing page gets a 'Tested by Meta's Muse Code' section after the
  model cards, linking to the write-up

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ion without the sandbox note

Browsers fetch /favicon.ico on their own and cache it hard, so removing
create-next-app's icon kept the old N in the tab; the Braille R is now drawn
at 16/32/48 px and 180 px, and a test checks it isn't the default. The
landing section drops the sandbox caveat; the docs say where each suite ran.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ne; model cards link to GitHub

- docs/install/README.md opens with what Recall is and the questions it
  answers, then the website, the no-keys demo and the live setup (keys by
  name only, pairing by QR with the app's confirmation, Wi-Fi or Tailscale,
  Xcode's plugin trust step, the Watch)
- the site's downloadable /INSTALL.md is that guide, word for word; a test
  also checks it holds no keys, home paths or private links
- the landing page's model cards link to the code on GitHub instead of
  printing paths

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ooms, zoomable drawings, robot downloads, more numbers

- Try the demo and a hero button open /homes/flat/viewer, marked Actual scan;
  the Muse Code tiers say how many agents each runs
- viewer: x/y/z axes with metre marks and magnetic north; More options with
  camera presets and per-view settings (wall opacity, furniture, wireframe,
  flat shading, the architect's wall cut); Dots and Architect marked Best view;
  the canvas keeps its own shape so controls never squeeze it on a phone
- What Recall found folds by room, like the app
- new tables: Agentic AI built on Meta (Guide, Verifier, Home Memory, Muse
  Code) and more measured numbers, each computed from the scan's own data
- drawings: say which Meta models measured and found what (no language model
  draws), floor statistics, and an in-page zoom with Esc and focus return
- robot files downloadable one by one or as a zip; a guard test checks them
- 'Public data only' callout; Read this section looks past the menu panel
- the plan sheet's things list fits three columns inside the frame

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ns as a 3D wireframe; Baseten credited

- tables, desks, chairs, beds, sofas and cabinets are grounded even when SAM
  3.1's mask stopped above their legs (a desk seen from above at 0.6 m);
  a wall shelf or TV keeps its height; no part ever reaches below the floor
- the architect view shows a north arrow in its own plan frame, as an
  architect's model does, and no x/y/z axes
- choosing Surface selects the 3D camera, the axes and the wireframe
- the model cards say where each model runs; Baseten serves Muse Spark Open
  (the Guide and the outside-agent screen), in docs/muse.md too
- the install guide's viewer check mentions Actual scan and Try the demo

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… reviewed)

The scan of 1 November 18:11 (162 photos, 24 things, 28 pieces of furniture)
for /homes/flat/viewer: points and surface tinted by height, the architect
model, the floor plan and elevation sheets, and the robot files. No photos,
no photo colours, no depth images, paths or keys; reviewed and approved by
the author.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eten sections, with reviewed app screenshots; the recorded demo sample and the ROS 2 example

- README: LiDAR + Meta models line, installation section, code layout and
  tests, Meta Muse in the code (with Baseten), Muse Code's three tiers
- docs/media: six iPhone app screenshots (app screens only, reviewed)
- samples/replay/flat: the recorded real run make demo replays (labels,
  geometry and recorded Muse Spark Open replies; reviewed)
- examples/ros2-robot: a ROS 2 package that loads Recall's robot export

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The pipeline job failed at test collection (libEGL.so.1 missing on the
Ubuntu runner), which made dev red since Open3D tests landed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PageProps and LayoutProps are generated by Next; calling tsc on a fresh
checkout failed. The app's own typecheck script runs next typegen first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ards link to what is built

- README: Security and privacy (what stays, what goes where, the published
  demo scan, how the memory is protected, what is not done yet) replaces a
  privacy line that no longer held; Data model with an ER diagram, every
  table, the append-only triggers, indexes and what is not in SQL
- landing Devices: the Watch is Preview (built, being tried on a real Ultra 4),
  matching the app; Robots and Watch cards say what works and link to it: a
  real robot package, the robot files of the actual scan, the ROS 2 example,
  the A2A Agent Card, the Watch code and its install steps

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…o anyone; Baseten badge; a fresh hero

- hero, FAQ and README: Recall is designed for the hardest case first and so
  works for anyone who misplaces things; the author's own story leads Why I
  built it
- usability stated honestly: automated checks today; the author's screen-off
  run (Screen Curtain, P0, never a substitute) and a session with blind and
  low-vision testers are planned
- README: Baseten badge, current test counts, Watch in preview, the ROS 2
  example in the repo, rate limits per key (no daily cap yet)
- docs/media/hero.png shows today's hero: Find your keys, the new intro, Try
  the demo and See a real room, scanned (Actual scan)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e real scan, the Meta models and Baseten

- the Never guesses card and a new FAQ answer say how: the 3D map decides,
  the code checks every place and number against the tool results, one
  correction, then the tool facts alone; links to grounding.py and its tests
- README Guardrails: never guesses, in four checks, with files and tests
- FAQ: 'Is there a real scan I can see? Yes' (links to the actual scan and
  GitHub) replaces 'Is the feed real? No'; new: which Meta models and why,
  Baseten, the open code; answers can carry several links

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A rescan that doesn't line up starts memory afresh in a world of its own,
but guidance kept planning in the home's first scan's frame: the person's
position and the floor grid came from that scan, the thing from the new
one, so no path was found ('I can't find a clear path'). Each guidance
session now uses the sighting's scan (its transform and floor grid) and
keeps it for re-planning and the arrival check; the first scan is only the
fallback. Also 'Your keys are', not 'is'.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
When the app reopened after a restart, the phone's first requests arrived
together and two threads ran the Alembic migration at once (cached_property
no longer locks in Python 3.12); one failed with KeyError 'script' and the
phone showed 'The Mac answered with an error (500)'. The engine is now made
under a lock, and create_app opens it before serving.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nd on scroll

In fields that grow with large text, Return typed a line break that was then
stripped, so the keyboard stayed; tapping outside did nothing either. Now
Return in a one-line field hides it, scrolling hides it, and while the
keyboard is up a tap anywhere outside a text field hides it (a window tap
recognizer that never cancels touches and exists only while the keyboard is
shown, so accessibility audits are unaffected). A usability test covers it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Like the device key, the address shows only enough to recognise it
(http://rac••••••:8000) until the eye button shows it in full for editing.
The audits of the Settings, room-map and See it in AR screens now check fixed
scroll positions instead of wherever a swipe stopped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… from the scan page

- the actual-scan buttons use the logo ring's yellow with ink text (12.3:1;
  5:1 against the blue nav, where the green sat at 1.05:1), black on yellow in
  high contrast, no lift with reduced motion
- the nav says 'Explore a real room' (it opens the author's actual room), not
  'Try the demo'
- the app pages get a top bar: the RECALL mark, Back to Recall, Ask Recall
- hero screenshot, install guide and README alt text follow

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…first

Settings → Appearance and voice → Voice picks the iPhone's best installed voice
for the choice and the iPhone's language: premium before enhanced before
default, the owner's region first, never a novelty voice or the Personal
Voice, and a voice of the other gender rather than silence. 'Speaking in Ava
(Premium)' plays a sample; a note says where to download a premium voice.
AVSpeechSynthesizer's own voices (an OS feature, not a model); with VoiceOver
on, VoiceOver's voice speaks as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vercel

vercel Bot commented Nov 2, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
recall Ready Ready Preview Nov 2, 2026 8:58am UTC

@coder-RT
coder-RT merged commit a3df60d into main Nov 2, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant