[{"title":"Home","url":"/","context":"Android Shop","text":"Android Shop is a growing collection of free, open-source Android apps and developer tools designed for small screens: android_scaffold turns Kotlin files into a running app, Thumb Inventory counts stock one-handed. Plus a small-screen design guide.","keywords":"Android Shop open source android apps free android apps android developer tools kotlin android projects jetpack compose examples one-handed apps offline android apps small screen design android_scaffold Thumb Inventory"},{"title":"Projects","url":"/#projects","context":"Home","text":""},{"title":"What every project has in common","url":"/#what-we-build","context":"Home","text":""},{"title":"Build for the device in your pocket","url":"/#small-screen-guide","context":"Home","text":""},{"title":"Official Android resources","url":"/#android-resources","context":"Home","text":""},{"title":"Frequently asked questions","url":"/#faq","context":"Home","text":""},{"title":"Projects","url":"/site/projects/","context":"Android Shop","text":"All Android Shop projects: free, open-source Android apps and developer tools designed for small screens, one-handed use and offline work, with docs, downloads and source code.","keywords":"Android Shop projects open source android apps android developer tools kotlin projects jetpack compose apps"},{"title":"Build your own","url":"/site/projects/#build-your-own","context":"Projects","text":""},{"title":"android_scaffold","url":"/site/android-scaffold/","context":"android_scaffold","text":"Free Python script that turns plain Kotlin and Jetpack Compose files into a running Android app: generates Gradle and the manifest, builds the APK, boots the emulator and live-reloads on save. Plus a guide to designing for small screens.","keywords":"android_scaffold android without android studio kotlin to apk build android app from command line jetpack compose without gradle setup android live reload android hot reload emulator generate gradle project android prototyping one-handed app design small screen ux thumb zone offline-first android"},{"title":"Get the script","url":"/site/android-scaffold/#get-the-script","context":"android_scaffold","text":""},{"title":"Write the app. Skip the project.","url":"/site/android-scaffold/#the-problem","context":"android_scaffold","text":""},{"title":"One file, one command","url":"/site/android-scaffold/#one-file-one-command","context":"android_scaffold","text":""},{"title":"Everything between your code and the phone","url":"/site/android-scaffold/#features","context":"android_scaffold","text":""},{"title":"A live prototyping loop","url":"/site/android-scaffold/#live-reload","context":"android_scaffold","text":""},{"title":"Build for the device in your pocket","url":"/site/android-scaffold/#small-screen-guide","context":"android_scaffold","text":""},{"title":"See it in a real app: Thumb Inventory","url":"/site/android-scaffold/#example-app","context":"android_scaffold","text":""},{"title":"Frequently asked questions","url":"/site/android-scaffold/#faq","context":"android_scaffold","text":""},{"title":"Install","url":"/site/install/","context":"android_scaffold","text":"Set up android_scaffold on macOS, Linux or Windows: download one Python file, install JDK 17+ and the Android SDK, and create an emulator or enable USB debugging on your phone.","keywords":"install android sdk command line android sdk without android studio ANDROID_HOME jdk 17 android create android emulator enable usb debugging android_scaffold install"},{"title":"Requirements","url":"/site/install/#requirements","context":"Install","text":""},{"title":"1. Get the script","url":"/site/install/#get-the-script","context":"Install","text":""},{"title":"2. Install JDK 17 or newer","url":"/site/install/#install-a-jdk","context":"Install","text":""},{"title":"3. Install the Android SDK","url":"/site/install/#install-the-android-sdk","context":"Install","text":""},{"title":"4. Set up an emulator or a phone","url":"/site/install/#set-up-a-device","context":"Install","text":""},{"title":"5. Check everything works","url":"/site/install/#check-everything","context":"Install","text":""},{"title":"Frequently asked questions","url":"/site/install/#faq","context":"Install","text":""},{"title":"Quick start","url":"/site/quick-start/","context":"android_scaffold","text":"Write a single Jetpack Compose MainActivity.kt, run one command and see it on an emulator or phone in minutes. Then add screens, packages and live reload.","keywords":"kotlin compose hello world first android app command line jetpack compose tutorial build apk from kotlin file run android app on emulator android quick start"},{"title":"Before you start","url":"/site/quick-start/#before-you-start","context":"Quick start","text":""},{"title":"1. Write one Kotlin file","url":"/site/quick-start/#write-one-file","context":"Quick start","text":""},{"title":"2. Run it","url":"/site/quick-start/#run-it","context":"Quick start","text":""},{"title":"3. Add a second screen","url":"/site/quick-start/#add-a-screen","context":"Quick start","text":""},{"title":"4. Turn on live reload","url":"/site/quick-start/#turn-on-live-reload","context":"Quick start","text":""},{"title":"5. Share the APK","url":"/site/quick-start/#share-the-apk","context":"Quick start","text":""},{"title":"Next steps","url":"/site/quick-start/#next-steps","context":"Quick start","text":""},{"title":"Frequently asked questions","url":"/site/quick-start/#faq","context":"Quick start","text":""},{"title":"How it works","url":"/site/how-it-works/","context":"android_scaffold","text":"What android_scaffold writes: settings and build Gradle files, AndroidManifest.xml with every Activity, a launcher icon and a Gradle wrapper, and how it picks packages, the application ID and the launcher Activity.","keywords":"android gradle project structure AndroidManifest activity registration gradle wrapper android application id compose bom android gradle plugin version"},{"title":"What you write versus what it writes","url":"/site/how-it-works/#what-you-write","context":"How it works","text":""},{"title":"The generated project","url":"/site/how-it-works/#generated-project","context":"How it works","text":""},{"title":"Versions and SDK levels","url":"/site/how-it-works/#versions","context":"How it works","text":""},{"title":"How packages and the application ID are chosen","url":"/site/how-it-works/#packages","context":"How it works","text":""},{"title":"How Activities are found","url":"/site/how-it-works/#activities","context":"How it works","text":""},{"title":"Permissions","url":"/site/how-it-works/#permissions","context":"How it works","text":""},{"title":"Incremental by default","url":"/site/how-it-works/#incremental","context":"How it works","text":""},{"title":"Frequently asked questions","url":"/site/how-it-works/#faq","context":"How it works","text":""},{"title":"Live reload with --watch","url":"/site/live-reload/","context":"android_scaffold","text":"Use android_scaffold --watch to rebuild incrementally, reinstall and relaunch your Kotlin app on the emulator every time you save a file, with compile errors shown in the terminal.","keywords":"android live reload android hot reload auto reinstall apk on save compose live preview alternative gradle continuous build android rapid android prototyping"},{"title":"Start watching","url":"/site/live-reload/#start-watching","context":"Live reload with --watch","text":""},{"title":"What happens on every save","url":"/site/live-reload/#what-happens-on-save","context":"Live reload with --watch","text":""},{"title":"When a save breaks the build","url":"/site/live-reload/#when-a-save-breaks-the-build","context":"Live reload with --watch","text":""},{"title":"App state resets on each reload","url":"/site/live-reload/#state-resets","context":"Live reload with --watch","text":""},{"title":"Watch on a real phone","url":"/site/live-reload/#test-on-a-real-phone","context":"Live reload with --watch","text":""},{"title":"Keeping reloads fast","url":"/site/live-reload/#faster-reloads","context":"Live reload with --watch","text":""},{"title":"Frequently asked questions","url":"/site/live-reload/#faq","context":"Live reload with --watch","text":""},{"title":"Commands and options","url":"/site/reference/","context":"android_scaffold","text":"Every android_scaffold command and option: --build-apk, --run, --watch, --start-emulator, --list-emulators, --output, --name and --apk-dir, plus the equivalent Gradle and adb commands.","keywords":"android_scaffold options gradlew assembleDebug gradlew installDebug adb shell am start emulator -list-avds android command line reference"},{"title":"Usage","url":"/site/reference/#usage","context":"Commands and options","text":""},{"title":"Common commands","url":"/site/reference/#commands","context":"Commands and options","text":""},{"title":"Options","url":"/site/reference/#options","context":"Commands and options","text":""},{"title":"Which device is used","url":"/site/reference/#device-selection","context":"Commands and options","text":""},{"title":"The same steps by hand","url":"/site/reference/#by-hand","context":"Commands and options","text":""},{"title":"Reading the output","url":"/site/reference/#output-lines","context":"Commands and options","text":""},{"title":"Environment variables","url":"/site/reference/#environment","context":"Commands and options","text":""},{"title":"Troubleshooting","url":"/site/troubleshooting/","context":"android_scaffold","text":"Fixes for common android_scaffold problems: Android SDK not detected, no Android Virtual Devices, Gradle wrapper download failures, JDK version errors and devices that adb cannot see.","keywords":"android sdk not found ANDROID_HOME not set no avd found adb device unauthorized unsupported class file major version gradle wrapper jar download"},{"title":"Quick fixes","url":"/site/troubleshooting/#quick-fixes","context":"Troubleshooting","text":""},{"title":"Android SDK not found","url":"/site/troubleshooting/#sdk-not-found","context":"Troubleshooting","text":""},{"title":"JDK version errors","url":"/site/troubleshooting/#jdk-errors","context":"Troubleshooting","text":""},{"title":"The first build is slow or fails to download","url":"/site/troubleshooting/#first-build","context":"Troubleshooting","text":""},{"title":"No emulator available","url":"/site/troubleshooting/#no-emulator","context":"Troubleshooting","text":""},{"title":"Phone not detected or unauthorized","url":"/site/troubleshooting/#phone-not-detected","context":"Troubleshooting","text":""},{"title":"Install fails with a signature conflict","url":"/site/troubleshooting/#install-fails","context":"Troubleshooting","text":""},{"title":"Frequently asked questions","url":"/site/troubleshooting/#faq","context":"Troubleshooting","text":""},{"title":"Designing for small screens","url":"/site/small-screen-design/","context":"Small-screen guide","text":"How to design Android apps for phones and other small, portable devices: one-handed use, thumb reach, touch targets, haptics, readability outdoors, offline work, interruptions and sharing.","keywords":"small screen design mobile ux guide designing for portable devices one handed app design mobile first design principles android app design tips field app design"},{"title":"Small screen, big context","url":"/site/small-screen-design/#the-context","context":"Designing for small screens","text":""},{"title":"Seven principles","url":"/site/small-screen-design/#the-principles","context":"Designing for small screens","text":""},{"title":"Touch first, keyboard last","url":"/site/small-screen-design/#touch-first","context":"Designing for small screens","text":""},{"title":"Mobility: capture data where it happens","url":"/site/small-screen-design/#mobility","context":"Designing for small screens","text":""},{"title":"Getting more out of your own phone","url":"/site/small-screen-design/#using-your-own-phone","context":"Designing for small screens","text":""},{"title":"Test like your users hold it","url":"/site/small-screen-design/#testing","context":"Designing for small screens","text":""},{"title":"Frequently asked questions","url":"/site/small-screen-design/#faq","context":"Designing for small screens","text":""},{"title":"The thumb zone","url":"/site/thumb-zone/","context":"Small-screen guide","text":"Where thumbs reach on a phone screen, why primary actions belong at the bottom, and how to lay out navigation, buttons and sheets for comfortable one-handed use on Android.","keywords":"thumb zone one handed mobile design thumb reach map bottom navigation reachability mobile button placement large phone usability"},{"title":"What is the thumb zone?","url":"/site/thumb-zone/#what-is-the-thumb-zone","context":"The thumb zone","text":""},{"title":"Why the thumb zone matters more on large phones","url":"/site/thumb-zone/#why-it-matters-on-large-phones","context":"The thumb zone","text":""},{"title":"Map each action to a zone by how often it is used","url":"/site/thumb-zone/#map-actions-to-zones","context":"The thumb zone","text":""},{"title":"Patterns that keep actions within thumb reach","url":"/site/thumb-zone/#bottom-navigation-and-sheets","context":"The thumb zone","text":""},{"title":"Left-handed, right-handed and switching hands","url":"/site/thumb-zone/#left-and-right-handed-users","context":"The thumb zone","text":""},{"title":"The thumb zone in practice: Thumb Inventory","url":"/site/thumb-zone/#thumb-zone-in-thumb-inventory","context":"The thumb zone","text":""},{"title":"How to test one-handed use","url":"/site/thumb-zone/#test-one-handed-use","context":"The thumb zone","text":""},{"title":"Frequently asked questions","url":"/site/thumb-zone/#faq","context":"The thumb zone","text":""},{"title":"Touch targets and gestures","url":"/site/touch-targets-and-gestures/","context":"Small-screen guide","text":"How big touch targets should be, how to space them, and when to use tap, swipe, double-tap, long-press and bottom sheets, with Jetpack Compose examples and undo instead of confirmation dialogs.","keywords":"touch target size 48dp minimum touch target android gestures swipe to dismiss compose long press compose undo vs confirmation dialog fat finger problem"},{"title":"How big should touch targets be?","url":"/site/touch-targets-and-gestures/#minimum-touch-target-size","context":"Touch targets and gestures","text":""},{"title":"Visual size is not touch size","url":"/site/touch-targets-and-gestures/#visual-size-vs-touch-size","context":"Touch targets and gestures","text":""},{"title":"The fat-finger problem, and how to design around it","url":"/site/touch-targets-and-gestures/#fat-finger-problem","context":"Touch targets and gestures","text":""},{"title":"Choosing the right gesture for each action","url":"/site/touch-targets-and-gestures/#choosing-gestures","context":"Touch targets and gestures","text":""},{"title":"Make gestures discoverable and never the only way","url":"/site/touch-targets-and-gestures/#make-gestures-discoverable","context":"Touch targets and gestures","text":""},{"title":"Bottom sheets for \"more options\"","url":"/site/touch-targets-and-gestures/#bottom-sheets-for-more-options","context":"Touch targets and gestures","text":""},{"title":"Undo instead of \"Are you sure?\"","url":"/site/touch-targets-and-gestures/#undo-instead-of-confirmation","context":"Touch targets and gestures","text":""},{"title":"Try it on a real device","url":"/site/touch-targets-and-gestures/#try-it","context":"Touch targets and gestures","text":""},{"title":"Frequently asked questions","url":"/site/touch-targets-and-gestures/#faq","context":"Touch targets and gestures","text":""},{"title":"Haptics and feedback","url":"/site/haptics-and-feedback/","context":"Small-screen guide","text":"Use vibration, motion and short notices to confirm actions on a phone so users can keep their eyes on the task. When to use haptics, which kinds, and how to add them in Jetpack Compose.","keywords":"android haptic feedback compose haptic feedback vibration ux snackbar undo eyes free interaction mobile feedback design"},{"title":"Why feedback matters more on a phone","url":"/site/haptics-and-feedback/#why-feedback-matters-on-phones","context":"Haptics and feedback","text":""},{"title":"Eyes-free interaction with haptics","url":"/site/haptics-and-feedback/#eyes-free-interaction","context":"Haptics and feedback","text":""},{"title":"Choosing the right kind of vibration","url":"/site/haptics-and-feedback/#choosing-haptic-types","context":"Haptics and feedback","text":""},{"title":"Adding haptic feedback in Jetpack Compose","url":"/site/haptics-and-feedback/#haptic-feedback-in-compose","context":"Haptics and feedback","text":""},{"title":"Visual feedback that reads at a glance","url":"/site/haptics-and-feedback/#visual-feedback","context":"Haptics and feedback","text":""},{"title":"Short notices with Undo","url":"/site/haptics-and-feedback/#snackbar-with-undo","context":"Haptics and feedback","text":""},{"title":"Feedback that works for everyone","url":"/site/haptics-and-feedback/#accessible-feedback","context":"Haptics and feedback","text":""},{"title":"Frequently asked questions","url":"/site/haptics-and-feedback/#faq","context":"Haptics and feedback","text":""},{"title":"Readable text and contrast","url":"/site/readable-small-screens/","context":"Small-screen guide","text":"Make phone apps readable at arm's length, in sunlight and at large font sizes: sp units, type scale, contrast ratios, dark mode, glanceable numbers and supporting Android font scaling.","keywords":"mobile typography android font size sp contrast ratio accessibility readable in sunlight dark mode design android font scaling glanceable ui"},{"title":"Design for a glance, not a read","url":"/site/readable-small-screens/#glanceable-ui","context":"Readable text and contrast","text":""},{"title":"Mobile font sizes and sp units","url":"/site/readable-small-screens/#font-size-and-sp-units","context":"Readable text and contrast","text":""},{"title":"Support Android font scaling up to 200%","url":"/site/readable-small-screens/#android-font-scaling","context":"Readable text and contrast","text":""},{"title":"Contrast ratios that pass accessibility and real life","url":"/site/readable-small-screens/#contrast-ratio","context":"Readable text and contrast","text":""},{"title":"Readable in sunlight and in the dark","url":"/site/readable-small-screens/#readable-in-sunlight","context":"Readable text and contrast","text":""},{"title":"Dark mode done properly","url":"/site/readable-small-screens/#dark-mode-design","context":"Readable text and contrast","text":""},{"title":"A quick readability checklist","url":"/site/readable-small-screens/#readability-checklist","context":"Readable text and contrast","text":""},{"title":"Frequently asked questions","url":"/site/readable-small-screens/#faq","context":"Readable text and contrast","text":""},{"title":"Offline-first field apps","url":"/site/offline-first/","context":"Small-screen guide","text":"Design Android apps that work without signal in warehouses, basements and remote sites: save every change on the device, avoid login walls, keep data in plain formats and sync when you can.","keywords":"offline first android offline mobile app field data collection app local first software android local storage works without internet"},{"title":"Why offline-first matters on portable devices","url":"/site/offline-first/#why-offline-first","context":"Offline-first field apps","text":""},{"title":"Save every change instantly","url":"/site/offline-first/#save-instantly","context":"Offline-first field apps","text":""},{"title":"Avoid login walls and network gates","url":"/site/offline-first/#no-login-walls","context":"Offline-first field apps","text":""},{"title":"Keep data in plain, portable formats","url":"/site/offline-first/#plain-formats","context":"Offline-first field apps","text":""},{"title":"Sync later, in the background","url":"/site/offline-first/#sync-later","context":"Offline-first field apps","text":""},{"title":"Handling conflicts when two devices change the same data","url":"/site/offline-first/#handling-conflicts","context":"Offline-first field apps","text":""},{"title":"Test it offline, on a real phone","url":"/site/offline-first/#test-offline","context":"Offline-first field apps","text":""},{"title":"Frequently asked questions","url":"/site/offline-first/#faq","context":"Offline-first field apps","text":""},{"title":"Designing for interruptions","url":"/site/interruptions/","context":"Small-screen guide","text":"Phones get interrupted constantly. Keep state through calls, app switches, rotation and process death, resume exactly where the user left off, and respect battery on all-day field devices.","keywords":"android process death rememberSaveable save instance state compose android configuration change mobile interruptions ux battery friendly app"},{"title":"Mobile interruptions are the normal case","url":"/site/interruptions/#interruptions-are-normal","context":"Designing for interruptions","text":""},{"title":"Process death: the interruption you never see","url":"/site/interruptions/#process-death","context":"Designing for interruptions","text":""},{"title":"Save UI state with rememberSaveable and SavedStateHandle","url":"/site/interruptions/#save-ui-state","context":"Designing for interruptions","text":""},{"title":"Rotation and other configuration changes","url":"/site/interruptions/#configuration-changes","context":"Designing for interruptions","text":""},{"title":"Resume exactly where the user left off","url":"/site/interruptions/#resume-where-left-off","context":"Designing for interruptions","text":""},{"title":"Battery-friendly apps for all-day devices","url":"/site/interruptions/#battery-friendly","context":"Designing for interruptions","text":""},{"title":"A checklist for testing interruptions","url":"/site/interruptions/#test-interruptions","context":"Designing for interruptions","text":""},{"title":"Frequently asked questions","url":"/site/interruptions/#faq","context":"Designing for interruptions","text":""},{"title":"Sharing without a backend","url":"/site/sharing-without-a-backend/","context":"Small-screen guide","text":"Move data with the Android share sheet, Open with intents, the Storage Access Framework and local Wi-Fi, using plain CSV, so small apps need no backend, accounts or cloud.","keywords":"android share intent ACTION_SEND storage access framework android open with share csv android phone to phone transfer wifi no backend app"},{"title":"Why a no-backend app is often the better choice","url":"/site/sharing-without-a-backend/#why-no-backend","context":"Sharing without a backend","text":""},{"title":"Send with the Android share sheet (ACTION_SEND)","url":"/site/sharing-without-a-backend/#share-sheet","context":"Sharing without a backend","text":""},{"title":"Receive files with \"Open with…\" and \"Share to\"","url":"/site/sharing-without-a-backend/#receive-shares","context":"Sharing without a backend","text":""},{"title":"Save and load files with the Storage Access Framework","url":"/site/sharing-without-a-backend/#storage-access-framework","context":"Sharing without a backend","text":""},{"title":"Phone-to-phone transfer over local Wi-Fi","url":"/site/sharing-without-a-backend/#local-wifi","context":"Sharing without a backend","text":""},{"title":"Use CSV as the interchange format","url":"/site/sharing-without-a-backend/#csv-as-interchange","context":"Sharing without a backend","text":""},{"title":"Merge or replace: let the user decide","url":"/site/sharing-without-a-backend/#merge-or-replace","context":"Sharing without a backend","text":""},{"title":"Frequently asked questions","url":"/site/sharing-without-a-backend/#faq","context":"Sharing without a backend","text":""},{"title":"Thumb Inventory walkthrough","url":"/site/thumb-inventory/","context":"Thumb Inventory","text":"A walkthrough of Thumb Inventory, an open-source one-thumb stock counter built with android_scaffold: big tap targets, swipe and long-press, haptics with undo, offline storage and CSV sharing.","keywords":"inventory app android stock counting app jetpack compose example app open source android app kotlin one handed app example csv inventory"},{"title":"What the inventory app does","url":"/site/thumb-inventory/#what-it-does","context":"Thumb Inventory walkthrough","text":""},{"title":"Run the example with live reload","url":"/site/thumb-inventory/#run-it","context":"Thumb Inventory walkthrough","text":""},{"title":"Project layout: 26 files, six packages","url":"/site/thumb-inventory/#project-layout","context":"Thumb Inventory walkthrough","text":""},{"title":"Touch first: one thumb, no keyboard","url":"/site/thumb-inventory/#one-thumb-gestures","context":"Thumb Inventory walkthrough","text":""},{"title":"Layout built around the thumb zone","url":"/site/thumb-inventory/#thumb-zone-layout","context":"Thumb Inventory walkthrough","text":""},{"title":"Haptics and undo instead of confirmations","url":"/site/thumb-inventory/#haptics-and-undo","context":"Thumb Inventory walkthrough","text":""},{"title":"Saved instantly, works offline","url":"/site/thumb-inventory/#saved-instantly","context":"Thumb Inventory walkthrough","text":""},{"title":"Sharing and phone-to-phone sync without a backend","url":"/site/thumb-inventory/#sharing-and-sync","context":"Thumb Inventory walkthrough","text":""},{"title":"Exercises: change something and watch it reload","url":"/site/thumb-inventory/#exercises","context":"Thumb Inventory walkthrough","text":""},{"title":"Frequently asked questions","url":"/site/thumb-inventory/#faq","context":"Thumb Inventory walkthrough","text":""},{"title":"Small app ideas","url":"/site/app-ideas/","context":"Ideas","text":"Practical small Android app ideas that play to what phones do best: stock counts, inspections, meter readings, attendance, delivery checklists and more, each with a design starting point.","keywords":"android app ideas simple app ideas field service app inspection checklist app meter reading app attendance app internal tool ideas"},{"title":"What makes a good small app idea","url":"/site/app-ideas/#what-makes-a-good-idea","context":"Small app ideas","text":""},{"title":"Counting and stock ideas","url":"/site/app-ideas/#counting-and-stock","context":"Small app ideas","text":""},{"title":"Inspection and checklist ideas","url":"/site/app-ideas/#inspection-and-checklists","context":"Small app ideas","text":""},{"title":"Readings and log ideas","url":"/site/app-ideas/#readings-and-logs","context":"Small app ideas","text":""},{"title":"People and time ideas","url":"/site/app-ideas/#people-and-time","context":"Small app ideas","text":""},{"title":"The shared design behind these apps","url":"/site/app-ideas/#shared-design","context":"Small app ideas","text":""},{"title":"Build one this afternoon","url":"/site/app-ideas/#build-one","context":"Small app ideas","text":""},{"title":"Frequently asked questions","url":"/site/app-ideas/#faq","context":"Small app ideas","text":""},{"title":"About","url":"/site/about/","context":"Android Shop","text":"About Android Shop, a growing collection of free, open-source Android apps and tools designed for small screens, its principles, and its maker Abhishek Sengar.","keywords":"about Android Shop Abhishek Sengar open source android apps"},{"title":"Why Android Shop exists","url":"/site/about/#why","context":"About","text":""},{"title":"Principles","url":"/site/about/#principles","context":"About","text":""},{"title":"How this site is made","url":"/site/about/#how-its-made","context":"About","text":""},{"title":"Open source","url":"/site/about/#license","context":"About","text":""},{"title":"Get in touch","url":"/site/about/#contact","context":"About","text":""}]