FOR IT
For IT administrators: how Smart Pointer works (one-pager)
A presentation remote that links your phone and PC directly: no Wi-Fi, server or account between them, and the extension asks only for storage and runs only on Google Slides™ pages.
1. Architecture
Data flow
one way: iPhone → PC (notifications)
draws the dot / next, previous
docs.google.com/presentation/*- No server of ours
- No account
- App and extension code opens no network connections
- The user picks the device in Chrome's chooser each time
- We run no server, and there is no account.
- The iPhone is the peripheral and Chrome on the PC is the central. Chrome's Web Bluetooth API makes the connection, and the user picks the device in Chrome's chooser each time.
2. Data on the Bluetooth link
iPhone → PC (notifications), at most 20 bytes per message:
| Type | Contents | How often |
|---|---|---|
| POINTER | x and y relative to the screen (0–65535), shown/hidden flag, dot size, iPhone send time (ms, wraps every 65,536 ms), sequence number | While the pad is pressed, up to 60 per second |
| COMMAND | Next / previous (first, last, black screen, white screen and go-to-slide are reserved for later and unused in v1.0) | On each press |
| HEARTBEAT | Battery %, thermal state (4 levels), app in foreground, pad pressed | Every second |
Read once by the PC when it connects (INFO, iPhone → PC): JSON of at most 200 bytes, for example {"proto":1,"minor":1,"app":"1.0.0","platform":"ios","code":"SP-1A2B","caps":["rel","cmd.nav"]}
- Never on the link: slide content, screen images, audio, camera images, contacts, location, Apple ID, the user's name.
- No application data goes from the PC to the iPhone. The PC only subscribes to notifications and requests the INFO read.
- While waiting for a connection, the iPhone advertises the service UUID and a display code (
SP-plus 4 random hex digits, generated on first launch). PCs can find it only while the app is in the foreground: in the background, iOS leaves the display code out of the advertisement and moves the service UUID to an "overflow" area that PCs do not see. - Chrome's chooser may show the iPhone's own device name (set by the user). iOS exposes that name; the app does not send it.
3. Network traffic
- The app's and the extension's code open no network connections. They contain no fetch, XMLHttpRequest, WebSocket or URLSession calls, and no analytics, crash-reporting or other third-party SDKs.
- Exceptions, all started by the user: links to help, policies, the feedback form and the "I used it in a talk" form open in the browser when the user clicks or taps them. The rating request is Apple's standard feature (the StoreKit review request). The extension does not set an uninstall page (
setUninstallURL). - Traffic by the OS and browser themselves continues as usual: update checks by the Chrome Web Store and the App Store, and Google Slides' own traffic. Google Slides needs internet access unless offline access is set up.
4. Permissions
Chrome extension (Manifest V3)
Asks for
storage- Site access:
docs.google.com/presentation/*only
Does not ask for
host_permissionstabsscriptingdebuggerwebRequest<all_urls>- any other site
The extension asks only for storage and runs only on Google Slides pages.
iPhone app
Asks for
- Bluetooth
- Motion sensors (no permission needed on iOS)
bluetooth-peripheral
Does not ask for
- Camera
- Microphone
- Location
- Contacts
- Photos
- Local network
- Notifications
Bluetooth: the user chooses, per connection
Web Bluetooth connects only after the user picks the device in Chrome's chooser. No operating-system pairing. The iPhone sends to the first PC that connects only, and warns about a second one.
| Component | Asks for | Does not ask for |
|---|---|---|
| iPhone app | Bluetooth (NSBluetoothAlwaysUsageDescription). Motion sensors (no permission needed on iOS). Background mode bluetooth-peripheral (keeps the link during a short app switch; no pointer data is sent in the background) | Camera, microphone, location, contacts, photos, local network, notifications |
| Chrome extension (Manifest V3) | permissions: storage only. Content script runs only on https://docs.google.com/presentation/* | host_permissions, tabs, scripting, debugger, webRequest, <all_urls>, access to any other site |
- Install dialog: because the content script runs on Google Slides, Chrome shows a notice such as "Read and change your data on docs.google.com". On those pages the extension only detects the slideshow, reads the slide number, draws the dot and dispatches arrow-key events. It does not read slide text or images.
- App Store privacy label: "Data Not Collected". The privacy manifest declares only UserDefaults (reason CA92.1). Export compliance:
ITSAppUsesNonExemptEncryption = NO. - Store builds: self-test and motion-recording tools exist only in internal builds, never in the App Store or Chrome Web Store versions. "Advanced settings" is an ordinary, visible settings screen.
5. Data stored on the devices
| Where | What | Removed when |
|---|---|---|
| iPhone (UserDefaults) | Settings, display code, count of successful connections | The app is deleted |
Chrome on the PC (chrome.storage.local) | Settings; connection log (times, message counts, delay statistics, battery and thermal state, command history; no slide content) | Log after 24 hours; everything when the extension is removed |
6. The radio link: facts and limits
- The link is not encrypted, and no OS pairing (bonding) takes place. This is deliberate, so that no pairing prompt appears.
- Someone nearby can receive what section 2 lists. It contains no slide content.
- v1.0 has no authentication of the other device. If a spoofing device advertised the same name and the user picked it, it could step slides or show a dot. The mitigation is that users pick the code shown in their own app. The iPhone sends only to the first PC that connects and warns if a second PC tries.
- The message format reserves space so that message authentication, with a key shared by QR code, can be added later without breaking existing installs. No date has been set.
7. Organization policies (Chrome)
| Policy | Effect | What to do |
|---|---|---|
DefaultWebBluetoothGuardSetting = 2 (block) | Web Bluetooth is blocked everywhere, so Smart Pointer cannot connect | Needs 3 (ask) or unset. Chrome has no policy that allows Web Bluetooth for specific sites or extensions only (checked in the Chromium policy definitions on 2026-09-25) |
ExtensionInstallBlocklist = * | The extension cannot be installed | Add the extension ID to ExtensionInstallAllowlist (the ID will be listed here at launch) |
ExtensionInstallForcelist | Use it to deploy the extension | Value: extension-ID;https://clients2.google.com/service/update2/crx (the ID will be listed here at launch) |
ExtensionSettings | Can do the same as above. The extension will not work if runtime_blocked_hosts includes docs.google.com or blocked_permissions includes storage | Exclude as needed |
ExtensionAllowedTypes | If types are restricted | Include extension |
- Microsoft Edge: installs from the Chrome Web Store but is untested. Edge likely has policies with the same names; unverified.
- OS and MDM: it will not work if Bluetooth is disabled on the PC, or if MDM blocks the App Store or Bluetooth on company iPhones.
- v1.0 has no managed pre-configuration (
chrome.storage.managed).
8. Known limits
- Google Slides in Chrome on a PC only (no PowerPoint, Keynote, Safari or Firefox).
- PC: Chrome on macOS and on Windows 10 (1703 or later) and 11. Windows is "beta" until 3 Windows laptops have been reported working. Chrome on Linux is not supported, because Web Bluetooth is experimental there. The PC needs Bluetooth LE (a desktop PC may need a USB adapter).
- iPhone: iOS 17 or later. The app must be in the foreground to be found.
- After a disconnect, the extension retries automatically for about 15 seconds. After a longer break the user must pick the iPhone again in the chooser (because of iOS address changes and Chrome's behaviour).
- Latency depends on the connection interval chosen by the PC's operating system.
- It relies on undocumented Google Slides behaviour. If a Google change stops slide control, the pointer is designed to keep working, and fixes ship as store updates.
- One iPhone and one PC per connection.
- The connection window must stay open during the talk (minimized is fine).
9. How to check this yourself
- Extension:
chrome://extensions> "Details" shows its permissions and site access. The code is plain JavaScript with no build step, readable in the installed folder. Open DevTools > Network on the connection window to see that no requests are made. - iPhone app: the App Store privacy label, and iPhone Settings > Privacy & Security > App Privacy Report, which lists the network domains each app contacted after you turn it on.
Related: privacy policy · terms · confirmed setups · teams