Skip to content

Releases: BenTech2/glasshole

v1.0.4

Choose a tag to compare

@BenTech2 BenTech2 released this 29 Jun 19:59

GlassHole v1.0.4

Headline change: GlassNav is now a fully ported, GPL-3.0-licensed plugin based on CatotheCat11/GlassNav. Real VTM vector-tile rendering, Valhalla turn-by-turn navigation, head-up map rotation, share-from-Google-Maps pipeline, and offline map support that works without any internet on the glass.

⚠️ Experimental plugins in this release

Five plugins ship as experimental — they work end-to-end but have known rough edges and may have surprising behavior. File issues if anything's broken; expect quality improvements in 1.0.5.

  • GlassNav — turn-by-turn navigation. Route fetches require data via the phone; offline tiles only after dropping .map files into /sdcard/glasshole/maps/. Plugin AIDL bind can drop (settings page won't load + share doesn't open the activity); restart the launcher to recover.
  • Translate — tap-to-translate via on-device ML Kit. JP→EN quality on short/vertical signage is rough (ポイ捨て禁止 → "Traveling" was a real test result). First use needs Wi-Fi on the phone to fetch the OCR + translation models (~55 MB).
  • SkyMap — sensor-driven star / moon / planet overlay. Indoors without GPS the observer location falls back to a default mid-US point, so the alignment is fictional until you go outside with a fix. Magnetic interference (electronics, metal surfaces) makes the view drift; only ~70 brightest stars in the bundled catalog.
  • SkyTrack — AR overhead aircraft tracker via the OpenSky public ADS-B feed. Phone needs internet to fetch each poll; anonymous OpenSky tier is 400 req/day (~enough for ~3 hours at the default 30-second polling). Free registered tier bumps that to 4000 req/day. GPS must be fresh on the phone — if the status banner says "No GPS", briefly open Maps on the phone to nudge the location provider. Same magnetometer sensitivity as SkyMap.
  • AI Assistant — voice in, AI response on glass. Requires your own provider API key (OpenAI / Anthropic / Gemini). Response latency depends on the provider's API; failures show on glass as toast text rather than a structured retry UI.

New plugin — GlassNav

  • VTM vector map renderer (the same one upstream GlassNav uses).
  • Head-up rotation — map turns to face whatever direction you're
    looking, on all travel modes.
  • Share-from-Maps: open Google Maps on your phone, Share any
    destination → pick Navigate on Glass → glass opens GlassNav,
    the destination card loads, you pick walk / bike / drive (or set
    a default in plugin settings), Valhalla routes, navigation starts.
    Phone Maps no longer also starts navigating — glass-only by default.
  • Phone GPS over Bluetooth — opening GlassNav (any path: share,
    app drawer, voice trigger) automatically requests the phone to
    start streaming GPS to the glass. Position dot follows your phone.
  • Auto-fallback to driving when Valhalla rejects walk/cycle with
    DistanceExceeded on a too-long route.
  • Settings (phone-side, via Plugins → GlassNav → gear icon):
    • Keep glass screen on while GlassNav is open
    • Distance units (miles / kilometers)
    • Auto-start when route is shared (Ask / Walking / Cycling / Driving)
    • ETA display (Arrival time / Time remaining)
    • Speedometer (Off / Only while navigating / Always)
    • Speedometer position (Top-right / Bottom-right)
  • Runs on EE1, EE2, and XE.

Adding offline maps to your glass

Online tile fetching works but is slow on Glass and burns Wi-Fi. Offline map files make GlassNav way snappier and remove the internet dependency for the map view (you still need Wi-Fi or phone data for one-time Valhalla route fetches and Nominatim search).

1. Find a map file for your area

Browse https://download.mapsforge.org/maps/v5/ — pick your continent → country → state/region. The .map files are mapsforge v5 format, which is what VTM 0.27 (bundled with GlassNav) expects.

Sizes are reasonable — a whole US state is usually 200-700 MB. The full United States is ~12 GB and won't fit on EE1's 16 GB flash, so download per-state instead.

2. Push it to your glass

GlassNav scans /sdcard/glasshole/maps/ for any *.map files. Drop one or more there and it picks the best one automatically (any file whose bounding box contains your current GPS position; smaller bbox wins for finer detail; first file alphabetically if no GPS fix yet).

Find your glass's ADB serial first:

adb devices

Then push the map:

# Example — Michigan, 265 MB
curl -O https://download.mapsforge.org/maps/v5/north-america/us/michigan.map
adb -s <your-glass-serial> push michigan.map /sdcard/glasshole/maps/

You can drop multiple states in there — GlassNav will choose the right one each time based on where you are. Switching regions on a road trip needs no app interaction.

3. Force GlassNav to re-scan

adb -s <your-glass-serial> shell am force-stop com.glasshole.plugin.glassnav.glass

Open GlassNav again — adb logcat | grep MainActivity will show Loaded map from local file: /sdcard/glasshole/maps/michigan.map.

If no .map files are present in the new directory, GlassNav still falls back to the legacy /sdcard/Map.map slot for backwards compat, then to the online OpenStreetMap US tile server if neither exists.

Removing or replacing a map

adb -s <your-glass-serial> shell rm /sdcard/glasshole/maps/michigan.map

— then push a new one and force-stop again.

New plugin — SkyTrack

AR overhead-aircraft tracker. Inspired by the original idea behind cpaczek/skylight (MIT, design credit) — written from scratch as a GlassHole plugin rather than a direct source port. Look at the sky, see real flights nearby labeled with callsign + altitude.

  • Live ADS-B from the OpenSky Network — every poll the phone
    fetches /api/states/all for a bounding box centered on your
    current GPS, hands the result to the glass over BT.
  • Heading-rotated triangles at each aircraft's observer-relative
    (azimuth, altitude), sized by distance and colored by altitude
    band — orange under ~5,000 ft, chartreuse 5–20k, pale blue above.
  • Per-aircraft labels: callsign + altitude in thousands of feet
    (DAL860 10k ft). Toggleable in the plugin settings.
  • Settings: range 20 / 50 / 100 / 200 km · min altitude 0 / 1k
    / 5k / 10k ft · poll interval 10 / 20 / 30 / 60 s · labels on/off.
  • Free tier limits: anonymous OpenSky is 400 req/day; the 30 s
    default = 2,880 polls/day, so for sustained use create a free
    account at https://opensky-network.org (registered tier is
    4,000 req/day). Anonymous works for casual testing.
  • Same sensor pipeline as SkyMap — uses the Glass-worn coordinate
    remap + prism-flip correction. Tap the touchpad to toggle a
    debug HUD with live sensor + feed counts.
  • Attribution: OpenSky Network gets a card in Settings → Open-
    source licenses. cpaczek/skylight is credited there too as design
    inspiration.

Notifications: stacking + swipe-to-navigate + bigger text

The popup notification card got two related upgrades.

  • Stacking. When multiple notifications arrive close together, they queue up on a stack instead of overwriting each other. A 2 / 5 counter chip appears in the top-right corner whenever more than one notification is queued. Swipe forward / back to cycle through them. Swipe down still dismisses the current notification (the rest of the stack remains queued). The auto-dismiss timer resets on each interaction so you don't lose your place while reading.
  • Slide-through animation. Cycling between notifications now slides the new card in from the gesture-natural side while the old one exits the opposite way (220 ms decelerate ease) — same feel as the cover-flow paging in the notification drawer. A re-entry guard drops a second swipe while an animation is still running so the screen never shows two cards mid-flight.
  • Drawer-matching text sizes (XE). XE's popup card was sized about ⅔ as small as EE1/EE2 (and as the XE drawer card showing the same content). Bumped XE up to match — 36 sp title, 28 sp body, 32 dp title icon, 22 dp footer icon, 20 sp footer text. The N / M stack counter is 16 sp with a slightly heavier font weight on all three editions.

Other changes

  • About card on the home carousel now shows the glass's Wi-Fi MAC,
    Bluetooth MAC, and current IP address alongside the version + build
    number.
  • Companion + share path: phone-side GlassNavCompanionActivity adds
    in-app destination search (Nominatim) + send-to-glass + opt-in GPS
    streaming toggle, reachable via Plugins → GlassNav → Open.
  • Vendored maplibre-navigation-core (KitKat-compatible fork) with a
    Kotlin shim layer that bridges to the Java maplibre-gl 6.0.1
    artifacts so it compiles against our Kotlin 1.9 toolchain.
  • glass-gdk-stubs module providing compile-only Glass GDK class
    shapes — real implementations come from the Glass OS at runtime.

Install

Standard release flow — install the matching launcher APK for each of your editions, plus the phone APK and any plugin APKs you want. The GlassNav plugin APK is ~12 MB (includes VTM native libs for four ABIs).

Commits since v1.0.3

2ac34ed Bump build counters for v1.0.4 release artifacts
42b8020 GlassNav: full EE2 support — GDK fallbacks, gestures, no-remap sensor
fbca374 Weather: defuse phantom-thunder icon on the main time card
3f63166 Translate: fix capture orientation + aspect on EE1/EE2
db42c43 v1.0.4 release notes: add SkyTrack plugin section + experimental note
5abc411 SkyTrack plugin: overhead aircraft AR via OpenSky ADS-B
7abe0bb v1.0.4 release notes: call out experimental plugins
adbb749 SkyMap: fix orientation tracking on Glass — pitch axis was wrong
54a51d9 Notification popup: match drawer text sizes + slide-through animation
9577d0d GlassNav: correct stale EE1 GPU attribution in BuildingLayer comment
77369db Wi-Fi: persist phone-driven network adds via...
Read more

v1.0.3

Choose a tag to compare

@BenTech2 BenTech2 released this 22 Jun 16:36

GlassHole v1.0.3 is a feature-and-polish release on top of v1.0.2. The headline additions are a Home-screen weather + air-quality chip (Open-Meteo, no API key required), a live-fill battery indicator with threshold colors, an About card + Dev Tools settings tile with baked-in wireless ADB, phone-driven Wi-Fi control on glass, per-app notification sounds, and APK Manager over Wi-Fi LAN. Underneath that, EE1 and XE have been brought to full feature parity with EE2, and XE layouts have been consolidated with EE1 so the per-edition dimension fork is gone.

All artifacts in this release are debug-signed APKs — installable side-by-side over earlier debug builds, but not over a release-keystore install of the same package.

Highlights

Weather + Air Quality on the Home time card (new)

A bottom-left chip on Home that shows current conditions for the user's location:

  • Open-Meteo — keyless / signup-less / free forecast API. Phone fetches every N minutes (user picks) and ships the result over BT; glass caches and renders.
  • Weather block — 44dp condition icon (clear / partly cloudy / cloudy / fog / rain / snow / thunder, based on Material Icons paths) + 28sp current temperature + small "H 80° L 58°" line below.
  • Air quality — secondary call to Open-Meteo's air-quality?current=us_aqi endpoint. Renders a third line "AQI 42 · Good" colored by EPA category (green → yellow → orange → red → purple → brown).
  • Phone Glass Settings → Weather — "Show weather on Home" toggle, °F / °C picker, and "Refresh every" spinner (5 min / 15 min / 30 min / 1 hour / 2 hours, default 30).
  • Active location — every refetch requests a fresh fix via NETWORK provider (Wi-Fi positioning, no GPS spin-up), bounded by an 8 s timeout with last-known fallback. So picking 5 min actually produces 5-min location resolution across town.
  • Cached payload survives glass reconnects; goes stale and self-hides after 6 hours so a dead-phone overnight doesn't show ancient weather.

Live-fill battery indicator (new)

The Home Time card's battery icon is now a custom-drawn rounded-rect that scales its interior fill to the live percentage, with color thresholds:

  • > 30% → white
  • ≤ 30% → yellow
  • ≤ 10% → red

A small dark lightning bolt overlays the fill while charging so users who hide the percent text (via the existing "Show battery percent" toggle) still see the charge state.

About card + Dev Tools tile + Home Screen settings (new)

  • About card on the Home carousel (leftmost, to the left of Exit): plain-text app name + v1.0.3 · build N pulled live from PackageManager.
  • Dev Tools tile in the Glass Settings drawer: opens a dark XE-style detail screen baked into core. First row is Wireless debugging — reads service.adb.tcp.port and on tap fires setprop service.adb.tcp.port 5555 && stop adbd && start adbd via the new in-launcher RootHelper (Magisk/SuperSU prompts on rooted headsets; informative error on non-rooted, pointing the user at the USB workflow). A phone-side button in the Debug screen mirrors this so the SuperSU grant prompt can be triggered remotely.
  • Home Screen section in phone Glass Settings: Show battery percent toggle and Swap status icon sides toggle (mirrors battery vs phone/Wi-Fi icons across the top-bar).

Phone-driven Wi-Fi control on glass (new)

A new "Glass Wi-Fi" card in the phone's Glass Settings:

  • Toggle Wi-Fi radio on glass.
  • Scan & connect — opens a list of nearby networks with security badge + signal-strength bars; tap to connect (password dialog for WPA/WEP, direct connect for OPEN). All over BT (WIFI_SCAN_REQ/WIFI_SCAN_RESULT/WIFI_CONNECT_REQ/WIFI_CONNECT_RESULT).
  • Works on EE1/EE2/XE.

Per-app notification sounds (new)

The notification beep is now per-app configurable:

  • Built-in tone palette — beep, beep2, ack, nack, prompt, chime (driven by ToneGenerator).
  • Custom audio file uploads — pick an audio file in the phone's Notification Apps row picker → Wi-Fi LAN one-shot upload → glass plays it via MediaPlayer when that app's notifications fire.
  • Phone-side preview of bundled tones so you can pick before sending.
  • Per-app sound stored in notif_app_sounds SharedPreferences on glass, keyed by source pkg.

Wallpaper scale picker (new)

Three modes for the user-uploaded Home wallpaper:

  • Center (default) — fit, whole image visible, letterboxed
  • Zoom — centerCrop, fills the screen by cropping aspect mismatch
  • Fill screen — fitXY, stretches to fill

Live on Home, Settings drawer, and App drawer surfaces.

APK Manager improvements

  • Per-row "Launch on glass" button — fires LAUNCH_PACKAGE BT message to start that package's main activity on the headset.
  • Wi-Fi LAN upload path — replaces the BT chunking that was crashing the EE2 BT stack on larger APKs. Phone spins up a one-shot HTTP server, glass downloads, triggers the install dialog. 100 MB cap (vs 5 MB for wallpaper / notif-sound uploads).
  • Gallery uploader gains an "any file type" toolbar toggle (overflow menu, default off) so APKs / arbitrary files can ride the gallery transfer path.

XE consolidation + EE1/XE feature parity

XE renders at 160 dpi now, matching EE1/EE2:

  • New GlassXeApp.kt patches displayMetrics.densityDpi to 160 in Application.onCreate and re-applies on every Activity create (lifecycle callback), so the higher 240 dpi the XE display reports doesn't blow up every shared layout's dp/sp.
  • Nine XE-specific layouts (card_exit, card_media, card_nav, card_notification, page_app, page_dismiss_all, page_notification, page_setting, activity_notification_drawer) replaced with EE1 copies — no more hand-scaled ⅔-of-EE2 fork to keep in sync.

EE1 + XE now have feature parity with EE2:

  • Per-app notification sounds (NotifSoundPlayer + handlers + WallpaperUploadServer size-cap parameterized)
  • APK Manager Wi-Fi LAN upload path
  • Phone-driven Wi-Fi control (toggle / scan / connect)

Glass UX polish

  • Wi-Fi icon on Home actually lights up when connected. Was broken on KitKat (ConnectivityManager.activeNetwork is API 23+); switched to WifiManager.connectionInfo which works on every API level and reflects raw association state regardless of internet validation.
  • Now Playing: brighter album-text line to match artist; 40%-alpha topbar when a wallpaper is applied; NOW_PLAYING debouncer survives multi-skip swipe storms.
  • Optional Home wallpaper behind the Settings + App cover-flow drawers (each toggled independently in phone Glass Settings).
  • Notification sound master toggle + 0–100 volume slider on the phone (replaces the always-on hard-coded beep).
  • Wi-Fi IP recovery affordance on the phone connection card.
  • Running app version shown on the phone connection card.

Other additions

  • Phone-side LAN file share server on the Debug screen — gives glass a way to pull files when USB isn't an option.
  • Dev-tools plugin (plugin-devtools-glass) — SSH server + root tools + custom shell command runner. Separate from the new in-launcher Dev Tools tile (which is just the wireless-ADB part baked into core).

Install

Each glass zip contains the base launcher + standalone APK, the stream player, and the applicable plugins for that edition. Drop everything onto the headset over adb install -r. The phone APK installs on any modern Android.

🤖 Generated with Claude Code

GlassHole v1.0.2

Choose a tag to compare

@BenTech2 BenTech2 released this 15 May 20:17

GlassHole v1.0.2 is a feature-and-polish release on top of v1.0.1. The headline additions are user-uploaded wallpapers on Home (with a contrast-fade slider) and a phone-controlled teleprompter mode in the Notes plugin. Underneath that, the release pulls in two months of fixes across the BT bridge, the now-playing card, gallery cover flow, the live camera path, and the wake/sleep flow on EE1/XE.

All artifacts in this release are debug-signed APKs — installable side-by-side over earlier debug builds, but not over a release-keystore install of the same package.

Highlights

Custom Home wallpapers (new)

Upload an image from the phone and Home renders it behind the carousel, with a fade slider so UI text stays legible:

  • Phone-side upload — "Upload wallpaper" button in the Glass Settings page → standard image picker → the phone downscales to 1920px / JPEG-80 and posts the result to a one-shot HTTP server the glass spins up over Wi-Fi LAN (BT carries only the short BG_UPLOAD_REQ/BG_UPLOAD_OPEN/BG_UPLOAD_DONE envelopes). Tokenised URL, 5 MB cap, 60 s idle timeout.
  • Fade overlay slider (0–255) — black overlay alpha drawn on top of the wallpaper. Drives a SET_BACKGROUND_FADE BT message; takes effect live on glass.
  • Latest-wallpaper-wins — every successful upload prunes older files from /sdcard/GlassHole/backgrounds/. Manual adb push still works; the directory is pre-created at HomeActivity.onCreate so it exists on a fresh launcher install.
  • Live reloadWALLPAPER_CHANGED local broadcast picks up new uploads without backing out of Home.
  • Cards transparent over wallpaper — six of seven card layouts on each edition (card_time, card_media, card_notification, card_settings, card_exit, card_placeholder) flipped to a transparent root background. The Nav card stays solid black so the turn-by-turn HUD doesn't compete with the wallpaper.
  • All three editions — EE1, EE2, and XE all ship the same protocol and layout treatment. EE1 also got a BT enable-state backoff (5s → 15s → 30s → 60s) and ACTION_STATE_CHANGED recovery to keep the radio from thrashing.

Teleprompter mode in the Notes plugin (new)

A new TeleprompterActivity on the glass renders a note's text in large auto-scrolling type with phone-driven controls:

  • Phone-side control panel (TeleprompterControlActivity) — Play/Pause, Speed slider (0–200 px/s), Font size slider (14–64 sp), Restart, Stop. Launched from the action sheet on any note row in the Notes activity.
  • BT envelopesTELEPROMPTER_START ships the text + initial settings, TELEPROMPTER_CONTROL carries incremental updates (playing, speedPxPerSec, fontSp, restart), TELEPROMPTER_STOP closes the screen.
  • Local glass controls — tap toggles play/pause, swipe forward/back nudges speed ±5 px/s, swipe down exits. The activity echoes state via TELEPROMPTER_STATE so the phone UI reflects glass-side changes in real time.
  • The Notes plugin APK is a single shared module (minSdk 19) — the same build runs on EE1, EE2, and XE without per-edition variants.

YouTube share with timestamp

The phone's YouTube share now honours the ?t= timestamp in the shared URL — the glass-side stream player seeks to that offset before prepare(), so the video starts exactly where the link does. Handles both plain seconds (?t=120) and the 1h2m30s / 90s mixed format.

Gallery cover flow

plugin-gallery-glass and plugin-gallery2-glass both got the cover-flow drawer redesign:

  • Reflection plane below the focused tile, alpha-faded — a custom ReflectionImageView draws a flipped copy clipped to a fade gradient.
  • Stationary "chip" label under the carousel showing the title of the centered item instead of one label per tile (cleaner read at speed).
  • Zoom-open animation when picking a photo — the centered tile scales up into the detail view rather than cutting hard.
  • Drawer position persists across opens (matches the pattern other drawers now use).

Glass UX polish

  • Now-playing title rendered white, not black — MarqueeTextView on EE1/EE2 now syncs paint.color = currentTextColor before each scrolling frame (KitKat's TextView.paint isn't synced outside the StaticLayout draw path). XE already had the fix; this catches the other two editions up. Visible whenever the song title is long enough to scroll.
  • Glass BT writes serializedBluetoothListenerService now holds a write lock so two threads writing concurrently can't interleave bytes in the protocol stream. Previously caused intermittent frame interleave parse errors on the phone side.
  • Live camera frame rate smoothed on EE1 — fixed the aspect-ratio scaler and tightened the producer/consumer pacing so the LAN viewer doesn't see stutter.
  • Device Info no longer crashes the BT thread on EE1/XE — the device-info collector was throwing on a KitKat-missing API; now wrapped per-field with a sane fallback.
  • FULL_WAKE_LOCK on nav update for EE1/XE — the lighter SCREEN_BRIGHT lock was being silently no-op'd by some Glass OEM firmwares; the deprecated FULL_WAKE_LOCK + ON_AFTER_RELEASE combo wakes reliably and hands off to FLAG_KEEP_SCREEN_ON on the activity.
  • BT link is no longer torn down when the phone app is reopened via a notification tap (Android 14+'s same-UID activity-launch rules were closing the socket).
  • Notification app picker — toggling an already-enabled app off now works (was being silently rejected by the listener-state save path).

Phone

  • Background fade slider + "Upload wallpaper" button in the Glass Settings page (DeviceActivity).
  • Teleprompter action in the Notes row action sheet → opens the new TeleprompterControlActivity.
  • Detailed POST error reporting for wallpaper uploads — the toast now surfaces the exception class so you can tell a connection refusal from a timeout from a non-200 status.

Full commit list

6037cac Merge dev-v1.0.2 into main for v1.0.2 release
09055a9 Release v1.0.2
59b2246 Polish: precreate wallpaper dir on Home, log wallpaper upload errors
a82ac9d Phone-controlled teleprompter mode for the notes plugin
7f97c98 Wallpaper feature on EE2/XE, plus fade-prune, nav-card black, marquee fix
6043035 Background wallpaper on HomeActivity (phase 1) + EE1 BT enable backoff
e6f28e3 YouTube share with timestamp: seek to the shared offset on glass
a2f9a7b Gallery cover flow: reflections, chip title, zoom-open animation
068e305 Device Info no longer crashes the BT thread on EE1/XE
879aad9 Live camera: fix EE1 aspect ratio, smooth out frame rate
c3b863c Cover Flow reflections + stationary label chip in the drawers
ce0b9db Note why MediaPlugin title gate stays at isEmpty()
e8531da Use FULL_WAKE_LOCK for nav-update wake on EE1/XE
9a3b4d6 Don't tear down BT link when app is reopened via notification
ffda526 Fix notification app picker: can't uncheck enabled apps
c692cb2 Serialize glass-side BT writes to prevent frame interleave
f11e672 Bump glassholeVersion to 1.0.2

Install

  • glasshole-phone.apk — Pixel / Android 7+ companion app.
  • glasshole-glass-ee1-1.0.2.zip — Glass Enterprise Edition 1 bundle (base + stream player + plugins).
  • glasshole-glass-ee2-1.0.2.zip — Glass Enterprise Edition 2 bundle.
  • glasshole-glass-xe-1.0.2.zip — Glass Explorer Edition (XE) bundle.

Each glass zip ships both the standalone and launcher flavors of the base app — pick one.

GlassHole v1.0.1

Choose a tag to compare

@BenTech2 BenTech2 released this 06 May 17:31

GlassHole v1.0.1 is a feature-and-fix release on top of v1.0.0. It introduces an SSH client plugin you can drive from a Bluetooth keyboard on glass, ports it to all three editions (EE1 / EE2 / XE), and lays in a stack of phone-side and glass-side polish that's been backing up over the past several weeks.

All artifacts in this release are debug-signed APKs — installable side-by-side over earlier debug builds, but not over a release-keystore install of the same package.

Highlights

SSH client plugin (new)

A real terminal on the glass, driven by a Bluetooth keyboard you pair with the device:

  • JSch (mwiede fork) for the SSH layer — Ed25519, ECDSA, AES-GCM, curve25519-sha256 KEX, modern auth.
  • Termux's terminal-emulator + terminal-view vendored as sdk/terminal-view — full VT/xterm renderer, scrollback, alt buffer, color, cursor positioning. Runs Claude Code without misrendering.
  • Profile manager on the phone — name / host / port / user, password or pasted PEM key. Profiles sync to the glass automatically; tap the Connect button on a row to fire Quick Connect which foregrounds the terminal on glass.
  • SSH key generator on the phone — Ed25519 keypair on-device, copy-public-key for pasting into authorized_keys.
  • EncryptedSharedPreferences at-rest for passwords + private keys on EE2 (AES-GCM with Keystore-wrapped master key).
  • Glass-side gestures: drag forward/back along the touchpad to scroll, swipe down twice to disconnect (4-second confirm window).
  • EE1 + XE port (KitKat): same APK, with BouncyCastle bundled to fill in the algorithms KitKat's JCE doesn't ship. Encryption falls back to plain SharedPreferences on those editions — both the phone SSH page and the on-glass picker carry an unmissable disclaimer about the at-rest tradeoff.

Phone app

  • New galaxy-orb logo (glasshole.png) wired into the launcher icon (adaptive + density-bitmaps) and shown next to the title in the header. Adaptive icon foreground inset 20dp so it stays visually inside the launcher mask without zooming.
  • Open-source licenses page crediting every direct Maven dependency + vendored library. NewPipeExtractor's GPL-3.0 status called out alongside attribution-required Apache 2.0 / BSD entries. Updates required when adding/removing deps.
  • Update banner: hits GitHub's /releases/latest on launch (throttled to one network call per 6 hours, persisted across launches), shows a card under the title when a newer tag exists. Tap to open the release page; tap dismiss to silence per-tag.
  • SSH page entry moved into the Plugins list (alongside Notes / Calc) instead of cluttering the main page.

Glass UX

  • Sender / channel avatars in notification surfaces. Popup, home preview, and notification drawer pages all now paint the sender avatar to the left of the title, mirroring the popup's dual-slot layout. Fallback chain extracts from EXTRA_LARGE_ICON (Bitmap or Icon), EXTRA_LARGE_ICON_BIG, notification.getLargeIcon(), last MessagingStyle sender Person, EXTRA_PEOPLE_LIST first Person, with the source app icon as the always-populated last resort (so the title slot is never blank, even when the OS image-reduces a notification before our NLS sees it).
  • Scouter plugin polish: Vegeta-style red filter on the camera preview (ColorMatrix on a hardware layer; tunable matrix), bolder ring/tick/crosshair strokes, larger reticle pulse, locked-state black plate behind the power-level + classification text. EE1 viewfinder rotation fix (Camera.setDisplayOrientation(info.orientation)), setLetterSpacing API-21 guard.
  • Live-camera live-stream rotated 90° at the source for EE1 (sensor is mounted 90° off the display) — phone viewer always sees an upright frame.
  • Invert-glass-navigation toggle in the phone Device settings — flips swipe-forward / TAB / DPAD_RIGHT to "previous" across every cover-flow / drawer surface.
  • Stay awake while charging toggle in the phone Device settings — writes Settings.Global.STAY_ON_WHILE_PLUGGED_IN (best-effort) and holds a SCREEN_BRIGHT_WAKE_LOCK while plugged in (the OEM doesn't always honor the global setting on EE2). Requires WRITE_SECURE_SETTINGS granted once via adb.
  • Quick-launch icon on the phone Plugins page — sends a LAUNCH_PACKAGE envelope and wakes the glass screen so a phone-tap surfaces the plugin's main activity.
  • Plugin host stability: PLUGIN_LIST_REQ re-sync on phone reconnect, bindToHost retry-on-failure in GlassPluginService (250 ms → 8 s, 6 attempts), FLAG_INCLUDE_STOPPED_PACKAGES on the broadcast fallback path so manifest receivers in stopped plugin apps get woken.

Other

  • Per-edition build counters sync within their family (glass-edition: ee1 / ee2 / xe; stream-player: ee1 / ee2 / xe) so building one edition advances all three counters, avoiding INSTALL_FAILED_VERSION_DOWNGRADE when flashing the same code across multiple Glass devices.
  • Vendored Termux in sdk/terminal-view — Apache-2 carry-over from termux-app, customized with a non-PTY TerminalSession, default-method client interfaces, and a KitKat-friendly Canvas.drawText fallback for the renderer's drawTextRun path.
  • Pixel Fold crash fix: unfolded layout-w600dp was missing the new licenses button, NPE'd in bindViews. Mirrored the row.
  • PLUGIN_LIST_REQ doesn't surface as a notification anymore (was being routed through MSG: which the glass treats as a user-facing toast).

Full commit list

c8c0e5d Merge dev-v1.0.1 into main for v1.0.1 release
4aebb8e Release v1.0.1: bundle SSH + OpenCV plugins in release artifacts
4a55838 Port SSH plugin to EE1 + XE (KitKat / API 19)
12f84c4 Bottom-align the version label with the GlassHole title
313b7fa Phone app: galaxy-orb logo + GitHub release update banner
e783d74 Fix unfolded-Pixel crash on app launch
38d31b7 Render sender avatar on home card preview + notification drawer pages
4d7e064 Notification avatars: full fallback chain + show all stored captures
3e66d1b Wake the glass display for remote launches + actually keep it on while charging
054dcd1 SSH terminal: Glass-native swipe gestures for scroll + disconnect
b0c310d Stop PLUGIN_LIST_REQ from showing as a glass notification
6632e6e Plugin host UX: stability + quick-launch + stay-awake-while-charging
379d9fa Add SSH client plugin with phone-side profile + key management
7475ef8 Add open-source licenses page on the phone
373fc73 Vendor Termux terminal-emulator + terminal-view as sdk/terminal-view
3179320 Rotate EE1 live camera frames 90° at the source
c801806 Scouter: Vegeta-style red filter, EE1 fixes, bolder HUD
bafbc9d Add invert-glass-navigation toggle in phone Device settings
f1bd080 Sync build counters across edition families
9be031d Scouter: TextureView preview to fix EE2 viewfinder
30e05cc Glass screenshot + keep-screen-on toggle in mirror viewer
c428a91 Render sender / channel avatar left of notification title
665729c Fetch YouTube thumbnails for Shorts notifications
0369c42 Gallery: multi-select, upload from phone, M3 redesign
caf0161 Camera privacy LED toggle in phone Device settings
6659e89 Live camera + screen mirror over Wi-Fi LAN from phone Debug
0abed9f Add scouter plugin — DBZ-style camera HUD with power-level reveal
199d70f Per-APK auto-incrementing build counter + branch-tracked version
d7f7f53 Persist battery history per glass + zoom & retention controls
031fbb6 Gallery: WiFi-LAN thumbnails + full-file transfer
b5da203 Filter foreground-service notifications + Ranking fallback
da19adc Add Glass Device Info page with live battery graph
0ceeb06 Add Actions group to phone Debug screen (EE2-only payloads)
ad6622f EE2: route camera key globally via accessibility service
9bb92d8 Camera plugin: hold-to-record + crash hardening (EE2 only)
e9b47e5 Filter notification noise from the phone listener
b40c280 Strip card chrome on the empty notification state

Install

  • glasshole-phone.apk — Pixel / Android 7+ companion app.
  • glasshole-glass-ee1-v1.0.1.zip — Glass Enterprise Edition 1 bundle (base + stream player + plugins).
  • glasshole-glass-ee2-v1.0.1.zip — Glass Enterprise Edition 2 bundle.
  • glasshole-glass-xe-v1.0.1.zip — Glass Explorer Edition (XE) bundle.

Each glass zip ships both the standalone and launcher flavors of the base app — pick one. SSH plugin requires a Bluetooth keyboard paired with the glass; on EE1 / XE be aware of the unencrypted credential storage caveat called out in the in-app disclaimer.

GlassHole v1.0.0

Choose a tag to compare

@BenTech2 BenTech2 released this 27 Apr 23:02

v1.0.0 — first stable

A consolidation release for the launcher/plugin/stream-player rework
plus everything that landed during v1.0.0-beta. APKs are signed with
the debug keystore so they install cleanly via adb without provisioning
a release keystore.

Editions

Each glasshole-glass-<edition>-1.0.0.zip ships:

  • glasshole-base-<edition>-standalone.apk — install alongside the stock Glass launcher (recommended for most users)
  • glasshole-base-<edition>-launcher.apk — replaces stock home; adds swipe-down lockNow() (deactivate device admin in Settings before uninstalling)
  • glasshole-stream-player-<edition>.apk
  • core + edition-specific plugin APKs

glasshole-phone.apk is the companion phone app.

Highlights since v0.4.0-alpha

  • Glass-side launcher flavor with HOME-card carousel (Time / Settings / Notification / Media / Nav, optional Exit) for EE1/EE2/XE
  • Time Machine notification stack on the carousel notification card
  • Now-playing card stabilized across YT Music track transitions (extrapolated position, blank-title handling)
  • Phone-side remote controls for the stream player (play / pause / ±10s seek / prev / next / scrubber)
  • Material 3 + force-dark phone UI redesign with grouped settings cards
  • Debug-only notification capture / replay for layout iteration
  • Dynamic plugin migration (AIDL-preferred dispatch, broadcast fallback)
  • "GlassHole Home" → "GlassHole" rename across activity labels and copy

Uninstalling the launcher flavor

The launcher flavor registers itself as a device administrator so it
can call lockNow() for swipe-down sleep. Android refuses to uninstall
an active admin — running adb uninstall first returns
DELETE_FAILED_DEVICE_POLICY_MANAGER. Deactivate the admin first, then
uninstall.

Option A — open the device-admin settings page over adb:

# EE2 (and any Android 5+ Glass build)
adb shell am start -a android.settings.SECURITY_SETTINGS
# or jump straight in:
adb shell am start -n com.android.settings/.DeviceAdminSettings

Then in the Glass UI, untap "GlassHole Sleep" → confirm.

Option B — one-shot via dpm:

# Pick the package matching what you installed:
adb shell dpm remove-active-admin com.glasshole.glassee2/com.glasshole.glassee2.home.HomeDeviceAdminReceiver
adb shell dpm remove-active-admin com.glasshole.glassee1/com.glasshole.glassee1.home.HomeDeviceAdminReceiver
adb shell dpm remove-active-admin com.glasshole.glassxe/com.glasshole.glassxe.home.HomeDeviceAdminReceiver

Then:

adb uninstall com.glasshole.glassee2   # or glassee1 / glassxe

Known notes

  • EE1 / XE notification picture corners aren't clipped to the card's rounded outline (API 19, no ViewOutlineProvider) — non-issue in practice as image notifications are rare on those devices.

GlassHole v0.4.0-alpha

Choose a tag to compare

@BenTech2 BenTech2 released this 19 Apr 02:20

GlassHole v0.4.0-alpha

Three brand-new plugins, Stream Player now handles YouTube Music and
full YouTube playlists, a configurable notification timeout, and a
bunch of quality-of-life work across EE1 / EE2 / XE.

New plugins

OpenClaw — Telegram bot kickstarter

  • Tap the OpenClaw tile on the glass to fire a one-shot Telegram
    message from your configured bot. Use it to kickstart a chat with
    OpenClaw (or any bot) so you can voice-reply
    from your phone's Telegram app.
  • Phone settings: bot token (password-masked), chat ID
    (password-masked), custom kickstart text. Send test message
    button to verify credentials before leaving the settings screen.
  • Runs on EE1, EE2, and XE.

Chat — Twitch + YouTube Live chat viewer

  • View chat for one Twitch channel or one YouTube Live stream at a
    time, scrolling on the glass.
  • Twitch is anonymous (no login) over IRC/TLS.
  • YouTube uses your own Data API v3 key — free tier covers a full
    session easily. Paste a live video URL or just the 11-character ID.
  • Twitch usernames are coloured to match each user's Twitch chat
    colour; YouTube uses a stable pseudo-colour per channel.
  • Phone settings: platform selector, channel / API key / URL, font
    size (10–24 sp), chat cache (50–1000 messages).
  • Glass gestures (tuned for the touchpad):
    • Swipe forward / back → scroll forward / back through chat
    • Tap → jump to latest
    • Swipe down → close
  • "Stick-to-bottom" behaviour: while you're scrolled up reading, new
    messages don't yank you to the bottom. Tap to catch up.
  • Runs on EE1, EE2, and XE.

Broadcast — RTMP streamer (EE2 full, EE1 / XE legacy)

  • Stream the glass camera to any RTMP endpoint (Twitch, YouTube Live,
    OBS, a local nginx-rtmp, …). Full URL with stream key, password-
    masked.
  • Four display modes while streaming:
    • Show viewfinder
    • Hide preview (screen stays lit)
    • Screen off after 3 seconds (tap to bring it back)
    • Show chat instead of viewfinder — uses Broadcast's own
      Twitch / YouTube settings, independent of the Chat plugin; RTMP
      feed is unaffected
  • Resolution / FPS / bitrate / mic-audio toggles.
  • EE2 variant (Camera2): defaults to 1280×720 @ 30 fps, 1500 kbps.
  • EE1 / XE variant (Camera1, packaged in those release zips):
    defaults to 854×480 @ 24 fps, 800 kbps to fit the older SoCs. Drop
    to 640×360 if you see stutter.

Stream Player

  • YouTube Music — music.youtube.com URLs now play, with album art
    on screen and audio-only encoding so the player isn't hauling video
    frames for a track that has none.
  • YouTube playlists — share a playlist URL (or any watch?v=…&list=
    URL) and the player walks the queue track-by-track. Swipe forward /
    back on the touchpad (or tap left / right on EE2) to jump; auto-
    advances when a track ends.
  • "Track N of M · Title" overlay at the bottom for a few seconds
    after each track transition.
  • Ported to EE1 and XE (previously EE2-only). Same native YouTube
    resolver via NewPipeExtractor.

Notifications

  • Configurable on-screen timeout in the phone's Glass Settings:
    3 s / 5 s / 8 s / 12 s / 15 s / 20 s / 30 s / 60 s. Value rides
    along with every forwarded notification, so there's no sync step —
    change it on the phone, next notification uses the new timeout.

Phone-app polish

  • Plugin-row settings icon is now a proper gear (was Android's
    default wrench, which was inconsistent across themes).
  • New Plugins ▸ Settings screens for OpenClaw, Chat, and
    Broadcast — open them from the gear icon next to the plugin row.
  • OpenClaw chat ID is password-masked to match the bot token.
  • Broadcast has its own chat-overlay configuration — completely
    decoupled from the Chat plugin's settings, so you can (for example)
    watch your Twitch on the Chat plugin and overlay a different
    channel's chat on the Broadcast feed.

Gesture fixes (EE1 / XE touchpad)

  • The Chat viewer, Stream Player, and Broadcast activities now handle
    both SOURCE_TOUCHPAD events (EE1 / XE) and screen-surface
    events (EE2) through a single shared gesture path, so scrolling and
    next/prev work the same on all three variants.
  • Tap-to-pause on Stream Player now works on EE1 / XE without relying
    on the GDK gesture detector's translated KEYCODE_DPAD_CENTER.

Install

Each glass zip (EE1 / EE2 / XE) is a drop-in set:

adb install -r glasshole-base-<variant>.apk
adb install -r glasshole-stream-player-<variant>.apk
adb install -r plugin-device.apk
adb install -r plugin-gallery.apk
adb install -r plugin-notes.apk
adb install -r plugin-calc.apk
adb install -r plugin-openclaw.apk
adb install -r plugin-chat.apk
adb install -r plugin-broadcast.apk     # Camera2 on EE2, Camera1 on EE1 / XE

Phone: install glasshole-phone.apk.

Known limitations

  • Broadcast screen-off mode drops the window brightness near-zero
    rather than truly powering the display — true off requires a
    foreground service which pauses the Camera capture.
  • YouTube Live chat needs your own API key; quota is per-key, so
    heavy/long sessions may eventually hit the free-tier daily cap.
  • EE1 / XE broadcast will struggle at 720p on the older SoCs; the
    480p24 default is the sweet spot.

v0.3.1-alpha — phone-app patch

Choose a tag to compare

@BenTech2 BenTech2 released this 16 Apr 23:36

GlassHole v0.3.1 — Phone app patch

Phone-app-only patch on top of v0.3.0-alpha. Glass-side APKs are
unchanged — keep your existing glass installs.

Fixes

  • Stop button on the GlassHole notification now actually stops the
    service.
    Earlier it left the reconnect loop + wake lock running
    because activities / the plugin host were still bound to the
    service. The Stop action now releases the Bluetooth socket, releases
    the wake lock, removes the notification, and kills the GlassHole app
    process outright. Tap the GlassHole launcher icon to bring it back
    when you want to use your glass again. This should fix the
    background-battery drain when the glass isn't nearby.
  • No more crash when unfolding to the inner screen. The
    two-pane layout for larger screens (layout-w600dp/activity_main.xml)
    was still on the pre-Plugins-screen button set, so the app
    NullPointerException'd on any Pixel Fold / tablet when the wider
    layout kicked in.

Install

Download glasshole-phone.apk below and install — the glass zips from
v0.3.0-alpha are still the right thing to install on your glass.

v0.3.0-alpha

Choose a tag to compare

@BenTech2 BenTech2 released this 16 Apr 21:48

GlassHole v0.3 — What's New

Glass app launcher

  • The GlassHole app on glass is now a plugin carousel — swipe to
    change focused plugin, tap to launch (XE, EE1, EE2)
  • EE1 / XE: hold a plugin icon for a details popup (version, variant,
    size, package)
  • The old "tap for voice reply" on the main screen is gone (tap-to-reply
    on notifications is unchanged)
  • Real icons on Notes, Calc, Camera, and Cover Flow Gallery (no more
    stock Android dialer / menu icons)

Stream Player — more sites, same one APK

  • Rebuilt as a single app: the old plugin-stream.apk is gone, its
    job is now done inside the Stream Player itself. One less APK per
    glass zip.
  • Renamed from "Glass Stream Viewer" to "Stream Player" (also moved
    package names into the com.glasshole.* namespace)
  • New native extractors: Vimeo, Dailymotion, Reddit (both v.redd.it
    and full post URLs)
  • Direct video URLs — anything ending in .mp4 / .webm / .mkv / .ts / .mov / .m4v now plays as progressive
  • WebView fallback — any URL we can't natively extract opens in a
    fullscreen WebView with HTML5 video (TikTok, Facebook, arbitrary
    sites). On modern Glass (EE2) this works for a lot of things; on
    KitKat-era glass (EE1 / XE) the built-in WebView is ancient so many
    modern sites will misbehave or refuse to load.

XE fixes (first real-hardware testing)

  • Notifications: action row now navigates correctly via touchpad — swipe
    between actions, tap to invoke
  • Notes: dictation + list view now sync with the phone
  • APK Manager + Plugins screen on phone work end-to-end with XE
  • Share a stream from phone → Stream Player wakes + plays on XE
  • Base app auto-rediscovers plugins when their APK is reinstalled (no
    reboot required)

Phone app

  • APK Manager: every GlassHole package now shows a GlassHole tag
    plus a Core or Plugin tag
  • Plugins screen: list is now dynamic — reflects whatever plugins
    are actually installed on the connected glass. Core apps (device,
    stream, photo-sync) are hidden
  • Plugin counter on the main screen shows the count of plugins on glass
    (not phone-side)
  • Main screen: Glass Gallery button added between Notifications and
    Plugins
  • Device Controls: Timezone picker — pick an IANA timezone and push
    it to the glass (non-rooted EE2 may still fail — the toggle falls
    back to su if available)
  • Notification forwarder drops media-playback "now playing" cards
    (YouTube, Spotify, etc.) so opening a video on your phone doesn't
    blast the glass every time

Device plugin (brightness / time / timeout)

  • Added a "Device Access" launcher tile on glass. Tapping it opens
    system settings and asks for the "Modify system settings" permission
    required on Android 6+ (EE2). Without this, brightness / timeout /
    auto-time silently fail.

Packaging

  • Release APKs are now debug-signed (same key across all modules)
    so sideloading from the release zip no longer hits "package not
    installed" errors. If you installed v0.2 APKs and had issues, this
    fixes that.

Known limitations

  • EE2 hold-for-details — the EE2 touchpad doesn't deliver a
    reliable long-press event for the launcher, so hold-for-info is XE /
    EE1 only.
  • Timezone changesetTimeZone is signature|privileged on EE2,
    so the native path is almost always blocked. The su fallback works
    only on rooted glass. Use your phone's Sync Time button as a
    workaround.
  • Stream Player first-boot delay — on KitKat the Stream Player APK
    hits MultiDex extraction (~8 s) the first time the base app tries to
    bind it after a reboot. One plugin may be unreachable for a few
    seconds until it warms up; everything after that is instant.
  • WebView fallback on XE / EE1 — KitKat's system WebView is very
    old; many sites (TikTok, Facebook, any site with a strict TLS
    handshake) will misrender or refuse to load. EE2's WebView is
    Chromium 62 and handles more.

Up next

  • Better phone-side extractor path (headless WebView on phone) so
    TikTok/Facebook/etc. work on XE and EE1 without relying on
    ten-year-old Chromium
  • Proper app icons on every plugin + both base apps (several still use
    stock Android drawables)
  • More plugin ideas: OpenClaw chat initiator, RTMP-out streamer

GlassHole v0.2.0-alpha

Choose a tag to compare

@BenTech2 BenTech2 released this 15 Apr 19:33

GlassHole v0.2 — What's New

Notifications

  • Wear-style action buttons on the card: Reply, Open on Phone, Watch on Glass
  • Voice reply sends straight back through the source app (texts, Discord, Telegram…)
  • Image previews for MMS, Discord, and doorbell snapshots
  • Smart Open on Phone deep-links to the specific video / article / chat
  • "Mark as read" / "Dismiss" clutter removed (swipe down already dismisses)

Phone App

  • New Plugins screen with per-plugin version + Open button
  • Main screen decluttered; auto-reconnects to your last Glass on launch
  • New Glass Settings toggles for auto-start and tilt-to-wake

Auto-start

  • Glass side now comes up on its own after reboot or reinstall (toggle in Glass Settings)

EE1

  • Bigger notification text, outlined action buttons with focus highlight
  • Touchpad nav fixed — swipe to move between buttons, tap to pick, swipe down to close

EE2 exclusives

  • Tilt to Wake — look up to turn on the display (optional, extra battery cost)
  • New Camera app replacing the stock one — tap to photo, long-press for video
  • Cover Flow Gallery — iPod-style carousel browsing of glass photos & videos

Housekeeping

  • Plugin labels cleaned up ("Notes", "Calc", "Stream" — no more "GlassHole" prefix)
  • Glass now shows the uninstall prompt when removing plugins from the phone
  • Reliability fixes for notifications, replies, and connection drops

Known limitations

  • Tilt-to-wake uses extra battery — it's off by default. Turn it on from Glass Settings only when you want the gesture; expect ~10–20% additional idle drain per hour on EE2 while enabled.
  • The new Camera plugin has no HDR and no flash — EE2 has no flash LED and its sensor doesn't expose a usable HDR scene mode.
  • EE1 and XE still need more real-hardware testing — please file issues if anything looks off on those variants.

Up next

  • XE support / testing
  • Plugin — Twitch and YouTube chat HUD for streamers
  • Plugin — RTMP streamer from the glass camera over Wi-Fi
  • Plugin — OpenClaw chat initiator
  • More cleanup to the phone app interface and layout
  • Actual app icons for everything

v0.1.0-alpha — first public release

Choose a tag to compare

@BenTech2 BenTech2 released this 15 Apr 01:08

First public alpha of GlassHole — a companion app + plugin system that lets a modern Android phone drive a Google Glass (Explorer Edition, Enterprise Edition 1, or Enterprise Edition 2) over Bluetooth.

⚠️ Disclaimer

This project was authored entirely by an AI (Claude Code) under human direction. No warranty, no liability — including for bricked hardware, lost data, or failed relationships stemming from spending your weekend sideloading a ten-year-old wearable. See README.md for the full disclaimer and liability waiver.

What's included

glasshole-phone.apk — the phone companion. Install this on your Android phone.

Three glass bundles, one per hardware generation. Pick one:

  • glasshole-glass-ee1-v0.1.0-alpha.zip — for Glass Explorer Edition and EE1-era hardware (Android 4.4 base)
  • glasshole-glass-ee2-v0.1.0-alpha.zip — for Glass Enterprise Edition 2 (Android 8.1)
  • glasshole-glass-xe-v0.1.0-alpha.zip — for real Google Glass Explorer Edition

Each zip contains the base app for that glass variant plus five plugin APKs. Install the base app first, then the plugins (or push them over BT later via the phone-side APK Manager).

Features

  • 📬 Notifications — forward phone notifications to glass as card-styled popups with the app icon and source name
  • 📝 Notes — voice-dictate on glass, sync to the phone notebook (and vice-versa)
  • 🧮 Calc — voice calculator with phone-side history
  • 📺 Stream share — share a YouTube or Twitch URL from the phone's share sheet, it auto-plays on glass
  • 🖼️ Gallery — browse, download, save-to-phone, or delete glass photos and videos
  • 🔅 Device controls — brightness, volume, screen timeout, manual wake
  • 📦 APK Manager — install and uninstall glass packages over Bluetooth
  • 🐛 Debug — in-app log panel + test-notification sender

Install guide

See the README in the repo root for full step-by-step instructions covering phone install, glass sideload, BT pairing, notification permissions, and per-feature usage. Also covers known limitations (BT bandwidth is slow, time sync needs root, etc.) and troubleshooting.

What's known-broken

  • Time sync on non-rooted glass silently falls back to auto-NTP (see README)
  • KDE Connect on EE2 crashes unrelated to GlassHole and blocks the glass display if installed
  • Glass XE support is tested only against a non-genuine Android 4.4 clone; real XE hardware should work via the included GDK timeline path but hasn't been verified
  • BT throughput limits gallery transfers to ~1–5 minutes per full-res item

Tested hardware

  • Pixel 10 Pro Fold (phone, Android 14+)
  • Glass Enterprise Edition 2 (Android 8.1)
  • Glass 2 OEM (EE1-style clone, Android 4.4.4)