Privacy & permissions
Kolahal has no account, no analytics, no ads and no crash reporting service: a crash report stays on your phone until you share it. Its dependencies are AndroidX, Jetpack Compose, WorkManager, OkHttp and the two script engines (LuaJava and quickjs-kt). Your log, settings, scripts, feeds and notifications are stored in the app’s private storage on the phone.
What leaves the device
Section titled “What leaves the device”Kolahal itself makes network requests in exactly three cases:
- Scripts you write or install, through
http.*andrss.*. They talk only to the URLs in their code. The library scripts use wttr.in, Open-Meteo, CoinGecko, open.er-api.com, api.ipify.org, Wikipedia, xkcd.com, ZenQuotes, Reddit, GitHub and the feeds they list. Requests carry aUser-AgentofKolahal-Launcher/0.1unless the script sets its own. - Feeds you subscribe to: one request per feed when it is due.
- Currency conversion with
= 100 usd in eur: a request to open.er-api.com for the base currency, cached for six hours.
Commands like search, yt, wiki, maps, play and url don’t make requests themselves. They
hand a link to your browser or the matching app.
Plain http:// is allowed, because many feeds are still served without TLS.
Crash reports
Section titled “Crash reports”new If Kolahal stops unexpectedly, it keeps a report on the phone: the app version and build, the Android version, the phone model, which part of Kolahal stopped, and the error with its stack trace (the code that was running). On Android 11 and newer it also notes when Kolahal froze (“not responding”) or crashed inside native code such as the script engines, from what Android recorded.
The next time you open home, a red line says Kolahal stopped unexpectedly; tap it to share the
report with the share sheet (email, a chat, or paste it into a GitHub issue). crashes lists the
reports, and crashes clear deletes them. Nothing is sent by itself, the newest 10 are kept, and
they are left out of Android’s backup. An error message can contain a bit of what you were doing
(a command, a file name), so read the report before you send it.
Permissions
Section titled “Permissions”Declared in the manifest:
| Permission | Why |
|---|---|
INTERNET |
scripts, feeds and currency rates (see above) |
ACCESS_LOCAL_NETWORK |
new Android 17 and newer: scripts with @uses lan and feeds on your own network (a home server, a router page). Asked for with local-network; optional |
ACCESS_NETWORK_STATE |
the net item in the header and device.network() |
READ_CONTACTS |
call, sms and contacts name matching. Asked for on first use; optional |
READ_CALENDAR |
agenda lists upcoming events. Asked for on first use; optional; nothing leaves the device |
SET_ALARM |
timer and alarm hand the timer or alarm to your clock app |
SCHEDULE_EXACT_ALARM |
remind fires on time (Android 12+ lets you turn it off; reminders may then be a few minutes late) |
RECEIVE_BOOT_COMPLETED |
pending reminders are set again after a reboot |
POST_NOTIFICATIONS |
notifications from scripts and feeds (Android 13+ asks at runtime) |
REQUEST_DELETE_PACKAGES |
uninstall and the Uninstall action open Android’s uninstall dialog |
EXPAND_STATUS_BAR |
swipe down on the header (or shade) pulls down the notification shade |
ACCESS_HIDDEN_PROFILES |
lets the default launcher see the Android 15+ private space |
PACKAGE_USAGE_STATS |
Usage Access, which you grant in Settings: accurate unlock counts and usage screen time |
ACCESS_NOTIFICATION_POLICY |
lists Kolahal on the Do Not Disturb access page, for dnd and ring silent (you still grant it) |
WRITE_SETTINGS |
“Modify system settings”, which you grant in Settings: brightness, rotate, screen-timeout |
ACCESS_WIFI_STATE |
whether Wi-Fi is on, for toggles |
torch needs no camera permission: it only switches the flash.
Kolahal also asks Android for the list of launchable apps (a <queries> entry for launcher
activities). That’s needed to show your apps at all.
Special access you can grant
Section titled “Special access you can grant”These are off until you enable them, usually from the setup checklist:
| Access | Why | Without it |
|---|---|---|
| Default home app | opens on Home; pausing/resuming profiles, app shortcuts, private space | works as a normal app |
| Usage access | accurate unlocks, usage |
unlocks counted while the launcher runs; no usage |
| Notification access | notifications in the log, notifs, notifications.recent(), media and the header’s now-playing line (reading media sessions) |
none of these |
| Do Not Disturb access | dnd, ring silent |
those print a tappable line to grant it |
| Modify system settings | brightness, rotate, screen-timeout |
those print a tappable line to grant it |
| Accessibility service Kolahal screen lock | double-tap / lock locks the screen. It can’t read window content and receives no events |
no lock gesture |
| Local network (Android 17+) | scripts with @uses lan, feeds on a home server |
those requests fail with a line to tap and allow it |
| Battery unrestricted | timers and feeds run on time | Android may defer them |
Notification text read through notification access stays on the device: it goes into the log and
an in-memory list, and a copy of the 50 most recent is kept so scripts can call
notifications.recent(). A script you write could send that data somewhere, the same as anything
else it can read, so only install scripts you trust and read the code of ones you get from others.
Scripts imported from a backup file arrive disabled for that reason.