Skip to content

Repository files navigation

🛍️ Android Shop

Free, open-source Android apps and developer tools, built for small screens, one-handed use and offline work.

Android Shop website License: GPL-2.0-or-later Kotlin and Jetpack Compose Python 3.8+

🌐 Website: android-shop.github.io · All projects · Small-screen design guide · App ideas

Android Shop is a growing collection of free, open-source Android apps and developer tools. Every project is small and focused, works one-handed and offline, and shares data without a server or account. Each one is also a readable Kotlin and Jetpack Compose example you can learn from or build on.

📦 Projects

Project What it is Links
⚡ android_scaffold Developer tool. A single Python script that turns Kotlin files into a running Android app, with live reload on every save. Overview · Quick start · Download
🧺 Thumb Inventory Android app. A one-thumb stock counter for shelves, fridges and stockrooms, with offline storage and CSV sharing between phones. Walkthrough · Source
🔜 More on the way New apps and tools are added regularly. All projects

⚡ android_scaffold

Build an Android app from plain Kotlin files in one command: no Android Studio, no Gradle setup, no XML.

Project page · Quick start · Live reload · Reference   macOS, Linux, Windows

android_scaffold is a free, open-source Python script that turns Kotlin and Jetpack Compose source files into a complete Android Gradle project, then builds the APK, boots the Android emulator (or uses your USB-connected phone), installs and launches the app, and live-reloads it every time you save. It is the fastest way to build an Android app from the command line without Android Studio, prototype an idea, or ship a small internal tool as an APK.

python3 android_scaffold.py my-app --name "My App" --watch

⬇️ Get the script: android_scaffold.py · direct download

curl -LO https://android-shop.github.io/android_scaffold.py

What people use android_scaffold for

  • Build an Android app without Android Studio using only Python, a JDK and the Android SDK
  • Turn a single Kotlin file into an APK you can send to any phone
  • Live reload / hot reload on the emulator: rebuild, reinstall and relaunch on every save
  • Rapid Android prototyping of Jetpack Compose and Material 3 UIs from any editor
  • Paste Kotlin code from ChatGPT, Claude or a blog and run it, Markdown fences and all
  • Auto-generate AndroidManifest.xml, Gradle files and the Gradle wrapper
  • Learn to design for small screens: thumb zone, touch targets, haptics, offline-first, sharing without a backend

🧱 Why small Android apps are harder than they should be

A phone is the most capable computer most people carry: a touchscreen, vibration, a camera, Wi-Fi, local storage, and a share menu that reaches every other app. Yet even a one-button Android app needs a whole project before your code can run:

my-app/
├── settings.gradle.kts           ← repositories, module list
├── build.gradle.kts              ← plugin versions
├── gradle.properties             ← JVM flags, AndroidX switches
├── local.properties              ← path to your SDK
├── gradlew  gradlew.bat          ← wrapper launchers
├── gradle/wrapper/…              ← wrapper jar + properties
└── app/
    ├── build.gradle.kts          ← SDK levels, Compose, dependencies
    └── src/main/
        ├── AndroidManifest.xml   ← every Activity, launcher intent
        ├── res/drawable/…        ← an app icon
        └── java/com/example/app/
            └── MainActivity.kt   ← the only file you actually care about

That's 12 files and about 220 lines of configuration across Gradle, XML and properties formats, plus matching versions of the Android Gradle Plugin, Kotlin and Compose. You also have to update the manifest every time you add a screen. For a quick internal tool or a prototype, that setup is often what stops the idea from getting built.

android_scaffold.py takes that setup over, so you only write the app.


🚀 One file, one command

tap-counter/
└── MainActivity.kt
package com.example.tapcounter

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            var taps by remember { mutableIntStateOf(0) }
            Button(onClick = { taps++ }) { Text("Tapped $taps times") }
        }
    }
}
python3 android_scaffold.py tap-counter --name "Tap Counter" --run

That one command:

  1. generates the full Gradle project, manifest and launcher icon,
  2. builds a debug APK,
  3. boots an emulator, or uses the phone you've plugged in,
  4. installs and opens your app,
  5. copies the APK to apk/, ready to send to anyone's phone.

What the script handles for you

You'd normally… The script…
Choose and match AGP, Kotlin and Compose versions Uses a known-good set of versions with Jetpack Compose and Material 3
Create the com/example/app/ folder tree Puts each file in the right folder based on its package line
Register every Activity in AndroidManifest.xml Finds your Activities and registers them, with MainActivity as the launcher
Choose an application ID Uses the package of your MainActivity
Install Gradle, or commit a wrapper Creates the Gradle wrapper for you
Point the build at your SDK Finds the SDK on macOS, Windows or Linux
Remember adb and emulator commands Runs them, and prints a cheat sheet in case you want to run them by hand
Clean up code pasted from a chat Removes leftover ``` fences

Grows with your app

Start with one file. When the app grows, add more files, packages and screens to the folder. Everything is picked up and registered automatically, with no build files to edit. The example app below is 26 Kotlin files across six packages, built with the same one-line command.


🔁 Live reload with --watch

python3 android_scaffold.py tap-counter --watch

Watch mode turns the script into a live prototyping loop. It boots the emulator and opens your app once, then watches your source folder. Every time you save a .kt file, it:

  1. waits for the save to finish, so a "save all" across several files triggers one reload,
  2. syncs only the changed files into android_build/,
  3. rebuilds incrementally (the Gradle daemon stays running between builds),
  4. reinstalls and relaunches the app on the emulator.
[*] Watching 'tap-counter' for Kotlin changes. Press Ctrl+C to stop.

[*] Changed: MainActivity.kt
[+] Reloaded in 2.8s. Watching for changes...

New files are picked up, deleted ones are removed, and new screens are registered. If a save doesn't compile, the error is printed and watching continues, so you fix it and save again. Press Ctrl+C to stop.


📖 Reference

Requirements

Python 3.8+ (standard library only)
JDK 17 or newer, on PATH or set with JAVA_HOME
Android SDK Found through ANDROID_HOME / ANDROID_SDK_ROOT, or the default Android Studio location
Internet First build only, to fetch the Gradle wrapper and dependencies
Device An emulator (Android Studio → Device Manager) or a phone with USB debugging, for --run and --watch

Commands

python3 android_scaffold.py <source>                      # generate / refresh the project
python3 android_scaffold.py <source> --build-apk          # + build the APK
python3 android_scaffold.py <source> --run                # + install and launch
python3 android_scaffold.py <source> --watch              # + reload on every save
python3 android_scaffold.py <source> --list-emulators     # list installed emulators
python3 android_scaffold.py <source> --start-emulator     # boot the first emulator
python3 android_scaffold.py <source> --start-emulator Pixel_8_Pro_API_33

<source> is a folder of .kt files (searched recursively) or a single .kt file. Rerunning any command is incremental: the existing project is reused and only changed files are copied.

Options

Option Default Description
-o, --output ./android_build Where the generated project goes. You can also open it in Android Studio.
-n, --name ThumbInventory App name under the launcher icon
--apk-dir apk/ next to the source Where a copy of the APK is placed
--build-apk off Build the debug APK
--run off Build, install and launch
--watch off Like --run, then rebuild, reinstall and relaunch whenever a .kt file changes
--start-emulator [AVD] off Boot an emulator, optionally by name
--list-emulators off List installed emulators and exit

Troubleshooting

Symptom Fix
Android SDK : Not auto-detected export ANDROID_HOME=~/Library/Android/sdk (or your SDK path)
No installed Android Virtual Devices Create one in Android Studio → Device Manager, or plug in a phone with USB debugging enabled
Could not download gradle-wrapper.jar Connect to the internet for the first build, or run gradle wrapper in the output folder
Build fails after a JDK change Point JAVA_HOME at JDK 17 or newer

📱 What to build: apps that use what phones do best

Once setup costs nothing, it's worth building small apps that do things a laptop or a web form can't. These are the Android strengths worth designing around.

1. Mobility: capture data where it happens

A lot of useful data is out in the field: on a shelf, at a job site, next to a machine, at a customer's door. A laptop needs a surface and two hands, and a desk-based workflow means remembering things and typing them in later, which is where mistakes creep in.

A phone app can:

  • record the moment you see it, one-handed, while you're standing in front of the thing you're counting or checking,
  • save every change instantly on the device, so nothing is lost if you're interrupted,
  • work fully offline in basements, cold rooms, warehouses and anywhere else without signal,
  • confirm each action with a vibration, so your eyes stay on the work instead of the screen.

Good fits: stock counts, site inspections, attendance, meter readings, delivery checklists, field surveys, equipment logs. See small Android app ideas.

2. Touch first, keyboard last

On-screen keyboards are slow and error-prone, especially while walking. Most data entry on a phone can be designed around the screen and your thumb instead:

Android building block Use it for
Large tap targets The most common action, one tap away
Swipe gestures Opposite or destructive actions, like decrementing or dismissing
Double-tap Quick toggles such as flags and favourites
Long-press Opening extra options without cluttering the screen
Bottom sheets Menus and choices where the thumb already rests
Haptic feedback Confirming an action without looking
Undo instead of "Are you sure?" Keeping the flow fast while still forgiving mistakes

Keep typing for the rare cases that truly need it.

3. Sharing without a backend

Android already connects apps and devices, so a small app often needs no server or accounts at all:

  • The system share menu sends data through WhatsApp, email, Bluetooth, Quick Share, Slack and any other app the user has.
  • "Open with…" lets your app receive files shared or tapped anywhere on the phone.
  • The storage picker saves and loads files from Downloads, Documents, Google Drive and other cloud folders the user has connected.
  • Local Wi-Fi or a hotspot moves data directly between phones, with no internet.
  • Plain formats like CSV keep the data readable in Excel and Google Sheets, so nothing is locked into your app.

📚 The small-screen design guide

The website expands each idea above into a practical guide, with Jetpack Compose examples, for anyone building apps for phones and other portable devices:

Guide What you'll learn
Designing for small screens The principles, plus Android settings that make your own phone easier to use
The thumb zone One-handed reach, bottom navigation, where to put primary actions
Touch targets and gestures 48dp targets, swipe, double-tap, long-press, undo instead of confirmation dialogs
Haptics and feedback Confirming actions without looking at the screen
Readable text and contrast sp units, contrast ratios, sunlight, dark mode, 200% font scale
Offline-first field apps Saving every change on the device and working without signal
Designing for interruptions Calls, rotation, process death and battery
Sharing without a backend Share sheet, Open with, Storage Access Framework, Wi-Fi between phones

🧺 Thumb Inventory

Thumb Inventory is an Android Shop app, and the first one built with android_scaffold. The src/ folder holds the complete app: a one-thumb stock counter for shelves, fridges and stockrooms. Read the walkthrough.

Item cards with large counts and Use / Add buttons Notice with Undo after a change Bottom sheet with large controls Share and sync bottom sheet

Idea How the example uses it
Mobility Count at the shelf with one hand. Each change is saved instantly and works offline. Zone tabs sit at the bottom of the screen within thumb reach.
Touch first Tap or swipe to add and remove, double-tap to flag, hold for a bottom sheet with bigger controls. Each change vibrates and shows a short notice with Undo. Day-to-day counting needs no typing.
Sharing without a backend Inventories move as CSV through the share menu, "Open with…", the storage picker, or straight to another phone over Wi-Fi or a hotspot. The receiver chooses whether to merge or replace.

Run it on an emulator or a connected phone with live reload:

python3 android_scaffold.py src --watch

Then change anything in src/, save, and watch the app reload. The fastest way to learn is to change something and see what happens.


🌐 The website

The Android Shop website at android-shop.github.io is generated from this repository by a standard-library Python script, the same way the app is:

python3 scripts/build_site.py

It reads the page manifest site-src/pages.json, wraps each fragment in site-src/pages/ with site-src/layout.html, and writes index.html and 404.html at the root and every other page under site/. It also writes sitemap.xml, robots.txt, Open Graph tags and schema.org structured data (articles, breadcrumbs, FAQ), and fails the build if any internal link is broken. Serve it locally with python3 -m http.server and publish it with GitHub Pages from the repository root.


🔎 Keywords

android shop, open source android apps, free android apps, android developer tools, kotlin android projects, jetpack compose example apps, android without android studio, build android app command line, kotlin to apk, single file android app, jetpack compose, material 3, compose starter, android project generator, gradle generator, androidmanifest generator, android scaffold, android boilerplate, android template, android live reload, android hot reload, emulator auto reload, adb install, gradlew assembleDebug, rapid prototyping, internal tools, python android build script, kotlin android tutorial, small screen design, mobile ux, one-handed design, thumb zone, touch targets, haptic feedback, offline-first, field data collection, inventory app, stock counting app, csv share, android share intent, storage access framework


📄 License

Copyright (C) 2026 Abhishek Sengar

All Android Shop projects, including android_scaffold and Thumb Inventory, are free software: you can redistribute them and/or modify them under the terms of the GNU General Public License, version 2 or (at your option) any later version (GPL-2.0-or-later), as published by the Free Software Foundation.

They are distributed in the hope that they will be useful, but without any warranty, without even the implied warranty of merchantability or fitness for a particular purpose. See the LICENSE file for the full text.

Every source file starts with the identifier SPDX-License-Identifier: GPL-2.0-or-later.

Releases

Packages

Contributors

Languages