Skip to content

saml212/stone-launcher

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Stone

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.

Twelve-app grid home screen

The twelve apps

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.

Install in ~10 minutes

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>\jbr

Confirm 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.apk

Or run the helper script, which does the same plus a few post-install nudges:

./scripts/setup-stone-phone.sh

4. Make Stone your home app

adb shell cmd package set-home-activity com.stonelauncher/.MainActivity

Or on the phone: Settings → Apps → Default apps → Home app → Stone Launcher.

That's it. Your home screen is now the Stone grid.

Turn on the parental blocker

This is what stops you from opening YouTube / Instagram / TikTok / Netflix / HBO Max. Opt-in by design.

  1. Open setParental Controls.
  2. You'll be sent to Settings → Accessibility → Stone Launcher. Toggle it on.
  3. 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.

Optional config

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:

Voice agent (the ask tile)

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 dev

Then 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.cloud

The 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.

Claude bridge (the claude tile)

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.com

Generate 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.

Repo layout

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

Contributing

PRs welcome — especially on these open items:

A few ground rules so contributions land cleanly:

  1. No personal endpoints in commits. URLs, ntfy topics, LAN IPs, API keys go in android/local.properties (gitignored). The build reads them via BuildConfig.
  2. Stock Android, no root. Anything that needs root or system modifications is out of scope.
  3. Test on a real device. Emulator is fine for layouts, but the accessibility blocker, package queries, and LiveKit voice need hardware to validate.
  4. Aesthetic guardrails: black #000000, white #FFFFFF, serif body. No decorative animation beyond a subtle text highlight.
  5. 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.

License

MIT — see LICENSE. Use it, fork it, ship it. If it helps someone reclaim their attention, that's the whole point.

About

An Android launcher for people who'd rather read. Twelve focused apps, no feed, no autoplay, with an opt-in blocker for the apps that pull you into doomscrolling.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors