Twelve apps. No feed. No autoplay. Nothing pulling at you.
Stone is an Android launcher for people who'd rather read. It replaces your home screen with a 3×4 grid of twelve focused apps — calls, texts, maps, music, calendar, notes, a voice assistant — and quietly blocks the ones that pull you into doomscrolling (YouTube, Instagram, TikTok, Netflix, HBO Max).
Black, white, serif. No decorative animation. No notifications fighting for your attention. A phone that's just a phone.
Stone is the software preview of the Stone phone concept at https://getthestone.com — same twelve-app grid, same philosophy, running on any Android 11+ device you already own. No root, no system modifications, single APK.
Status: alpha. The launcher is solid for daily use; the voice agent is optional and self-hosted.
| App | What it does |
|---|---|
| ask | AI chat (text + optional voice) |
| tick | Alarms, timers |
| pebbles | MCP tools (custom integrations) |
| set | Wi-Fi, Bluetooth, brightness, blocker |
| listen | Spotify control |
| look | Reading / digital library |
| plan | Calendar + goals |
| think | Notes |
| reflect | Journal |
| connect | Contacts (call, SMS, WhatsApp) |
| go | Maps / navigation |
| fund | Google Wallet |
| claude | (optional) ntfy bridge to your own AI hub |
All twelve live in a single APK, so the optional voice agent can drive them through in-process intents instead of IPC.
You need an Android phone (Android 11+), a computer, and a USB cable.
1. Prep your phone for sideloading
- Settings → About phone → tap Build number 7× until it says "you are now a developer."
- Settings → System → Developer options → enable USB debugging.
- Plug into your computer with USB. Tap Allow on the prompt.
2. Install the build tools (one-time)
You need the Android SDK's adb command and a Java 17 JDK. Easiest
path: install Android Studio,
which brings both.
# macOS — point Java at the JDK that ships with Android Studio
export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home"
# Linux — adjust the path
export JAVA_HOME="$HOME/android-studio/jbr"
# Windows — set JAVA_HOME via System Properties → Environment Variables
# pointing at <android-studio-install>\jbrConfirm adb devices lists your phone.
3. Build and install Stone
git clone https://github.com/saml212/stone-launcher.git
cd stone-launcher
# Optional: configure personal endpoints (only needed for the claude
# tile and voice features — see "Optional config" below).
cp android/local.properties.example android/local.properties
# edit android/local.properties
cd android
./gradlew assembleDebug
adb install -r app/build/outputs/apk/debug/app-debug.apkOr run the helper script, which does the same plus a few post-install nudges:
./scripts/setup-stone-phone.sh4. Make Stone your home app
adb shell cmd package set-home-activity com.stonelauncher/.MainActivityOr on the phone: Settings → Apps → Default apps → Home app → Stone Launcher.
That's it. Your home screen is now the Stone grid.
This is what stops you from opening YouTube / Instagram / TikTok / Netflix / HBO Max. Opt-in by design.
- Open set → Parental Controls.
- You'll be sent to Settings → Accessibility → Stone Launcher. Toggle it on.
- Back in set, confirm the blocker reads "Active".
⚠️ Android revokes accessibility permission whenever an app is uninstalled. If you reinstall Stone, repeat steps 1–2.
The block list lives in android/app/src/main/AndroidManifest.xml
(under <queries>) and android/app/src/main/java/com/stonelauncher/parental/AppBlockerService.kt.
Edit both, rebuild, and reinstall to change which apps get blocked.
Known gap (TICKET_PARENTAL_BLOCKER_FAILURE):
the blocker is app-level, not URL-level. It kills the YouTube and
Instagram apps when they launch, but youtube.com /
instagram.com in a browser are not yet blocked. Pair Stone with a
DNS-level blocker (NextDNS, Pi-hole, or your router's parental
controls) for full coverage.
The launcher works fine with no config beyond the install steps. Two features need extra setup because they touch services you self-host and shouldn't share publicly:
Self-host the LiveKit agent in agent/:
cd agent
npm install
cp .env.example .env
# Fill in: LIVEKIT_URL, LIVEKIT_API_KEY, LIVEKIT_API_SECRET,
# ANTHROPIC_API_KEY, STONE_SHARED_SECRET
npm run devThen in android/local.properties:
stone.tokenServerUrl=https://your-token-server.example.com
stone.tokenServerSecret=replace-with-your-64-char-hex-secret
stone.livekitUrl=wss://your-instance.livekit.cloudThe token server requires a shared bearer secret on every request —
generate one with openssl rand -hex 32 and use the same value on
both sides. Production deploy notes (Cloud Run / Fly / Railway) live
in agent/Dockerfile.token-server + agent/deploy-token-server.sh.
The agent worker itself runs on the LiveKit Cloud worker pool — see
agent/AGENT.md.
A lightweight push-notification bridge over ntfy.sh. Set up Claude Code (or any AI agent) on a machine you own to publish its updates to a long, secret ntfy topic; Stone subscribes from your phone so you can read replies and respond from the lockscreen.
In android/local.properties:
stone.ntfyTopic=replace-with-your-own-32-char-secret
# optional override if you self-host ntfy:
# stone.ntfyServer=https://ntfy.your-domain.comGenerate a topic name with something hard to guess
(uuidgen | tr -d - | head -c 32). Anyone who knows the topic can
read every message and inject fake ones — treat it as a password.
If stone.ntfyTopic is left blank, the claude tile shows a setup
hint instead of polling.
stone-launcher/
├── android/ # The launcher (single APK)
│ ├── app/src/main/
│ │ ├── AndroidManifest.xml # permissions + blockable apps
│ │ ├── java/com/stonelauncher/
│ │ │ ├── MainActivity.kt # 3×4 grid home screen
│ │ │ ├── ui/ # the 12 tile activities
│ │ │ ├── parental/ # AppBlockerService + helper
│ │ │ ├── livekit/ # voice connection lifecycle
│ │ │ ├── controllers/ # service-layer (telephony, etc.)
│ │ │ └── …
│ │ └── res/ # layouts, drawables, values
│ ├── app/build.gradle # reads local.properties
│ └── local.properties.example # copy this to configure
├── agent/ # optional voice/AI server (TS)
│ ├── src/ # token server + agent worker
│ ├── skills/ # per-tile skill prompts
│ └── AGENT.md
├── docs/ # architecture + integration notes
├── tickets/outstanding/ # known issues / planned work
├── scripts/setup-stone-phone.sh # one-shot installer helper
├── CLAUDE.md # notes for AI coding assistants
└── LICENSE # MIT
PRs welcome — especially on these open items:
TICKET_PARENTAL_BLOCKER_FAILURE— browser-bypass + the reinstall re-enable UXTICKET_ASK_GEMINI— research-grade Ask experience with Gemini + groundingTICKET_PEBBLES_APP— MCP tool surface inside the launcher
A few ground rules so contributions land cleanly:
- No personal endpoints in commits. URLs, ntfy topics, LAN IPs,
API keys go in
android/local.properties(gitignored). The build reads them viaBuildConfig. - Stock Android, no root. Anything that needs root or system modifications is out of scope.
- Test on a real device. Emulator is fine for layouts, but the accessibility blocker, package queries, and LiveKit voice need hardware to validate.
- Aesthetic guardrails: black
#000000, white#FFFFFF, serif body. No decorative animation beyond a subtle text highlight. - Choice-first: every action exposed by a tile must be reachable by both touch and an agent tool call. Don't ship voice-only or touch-only paths.
If you're using an AI coding assistant (Claude Code, Cursor, Codex,
Gemini CLI), CLAUDE.md has the working notes and
.claude/agents/ defines four specialist subagents
you can dispatch in parallel.
MIT — see LICENSE. Use it, fork it, ship it. If it helps someone reclaim their attention, that's the whole point.
