{"id":50668760,"url":"https://github.com/dutradotdev/quokka","last_synced_at":"2026-06-22T17:00:38.655Z","repository":{"id":360295838,"uuid":"1249490448","full_name":"dutradotdev/quokka","owner":"dutradotdev","description":"Inspect and clean a USB-connected device from your terminal: storage, apps, media, and a live log viewer. No jailbreak, no root.","archived":false,"fork":false,"pushed_at":"2026-06-10T00:08:52.000Z","size":16169,"stargazers_count":73,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-10T01:14:13.270Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dutradotdev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-25T18:56:24.000Z","updated_at":"2026-06-10T00:05:49.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/dutradotdev/quokka","commit_stats":null,"previous_names":["dutradotdev/quokka"],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/dutradotdev/quokka","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dutradotdev%2Fquokka","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dutradotdev%2Fquokka/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dutradotdev%2Fquokka/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dutradotdev%2Fquokka/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dutradotdev","download_url":"https://codeload.github.com/dutradotdev/quokka/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dutradotdev%2Fquokka/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34657902,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-22T02:00:06.391Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-08T09:00:20.029Z","updated_at":"2026-06-22T17:00:38.649Z","avatar_url":"https://github.com/dutradotdev.png","language":"Rust","funding_links":[],"categories":["Command Line Utilities","💻 Apps","Applications"],"sub_categories":["Others","👨‍💻 System Administration","System tools"],"readme":"# quokka 🐹\n\n\u003e Inspect and clean a USB-connected device from your terminal: storage, apps, media, and a live log viewer. No jailbreak, no root.\n\n[![CI](https://github.com/dutradotdev/quokka/actions/workflows/ci.yml/badge.svg)](https://github.com/dutradotdev/quokka/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n![Platform: macOS](https://img.shields.io/badge/platform-macOS-lightgrey.svg)\n![Devices: iOS · Android](https://img.shields.io/badge/devices-iOS%20%C2%B7%20Android-success.svg)\n\nquokka is a Mac CLI for the phone you have plugged in — iPhone **or** Android.\nIt reads storage, battery, apps, media, identity, and the live system log; it\ncan also reclaim space and reboot the device. iPhones are reached over\n`usbmuxd` and lockdown-classic services (no jailbreak, no `core_device_proxy`\ntunnel); Android devices over a local `adb` server (no root). No elevated\nprivileges on either.\n\nWorks on iOS 17+ and Android 8+.\n\n## What you can do with it\n\n- **Tail the device syslog while you debug.** `qk logs` opens a TUI viewer that filters live logs by level or process, with search, pause, and save. `--no-tui` streams plain text for piping or CI.\n- **Free up space on a test device.** `qk analyze` ranks the heaviest media files and `qk media -d` groups likely duplicates; both can delete from an interactive picker.\n- **Manage installed apps by size.** `qk apps` lists user apps largest-first and uninstalls by bundle id, with `--yes` for scripts.\n- **Read device, system, and storage state.** `qk status` and `qk info` print it in clean blocks; `--redact` masks serial, UDID, IMEI, and MAC for safe screenshots.\n\n## Quick start\n\n```sh\nbrew install dutradotdev/tap/quokka-cli\nqk\n```\n\nWith no arguments, `qk` opens the interactive launcher. See [Install](#install)\nbelow for `curl` and `cargo` alternatives.\n\n## Demo\n\n![quokka demo](docs/demo.gif)\n\n## Commands\n\n| Command           | What it does                                                                                                                                        |\n| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `quokka`          | Interactive launcher. Dashboard plus a menu to jump into any command below.                                                                         |\n| `quokka status`   | Print the device dashboard once.                                                                                                                    |\n| `quokka info`     | Static identity in three blocks (Device / System / Network). `--redact` masks serial, UDID, IMEI, and MAC for safe screenshots.                     |\n| `quokka apps`     | Picker of installed user apps by size. `--uninstall \u003cbundle-id\u003e` removes one directly.                                                              |\n| `quokka analyze`  | Walk media folders and surface the heaviest files. Read-only by default; `--delete` opens a picker.                                                 |\n| `quokka media`    | Survey camera roll and downloads. Per-kind counts, per-month breakdown, top-10 largest. `-d` adds likely-duplicate groups.                          |\n| `quokka logs`     | Stream the device's system log (syslog / logcat) in a TUI viewer. Filter by level or process, search, pause, save. `--no-tui` streams plain stdout. |\n| `quokka reboot`   | Soft reboot the device. Confirms by default; `--yes` skips.                                                                                         |\n| `quokka shutdown` | Power off the device. Confirms by default; `--yes` skips.                                                                                           |\n| `quokka devices`  | List every device reachable over `usbmuxd` (iOS) or `adb` (Android). Does not select one.                                                           |\n| `quokka card`     | Render a 1080×1080 PNG snapshot of the device, a neofetch-style flex card. Saves to `~/Desktop` and opens in Preview by default.                    |\n\n## Examples\n\n```sh\nqk status                              # one-shot device dashboard\nqk info                                # full identity (Device + System + Network)\nqk info --redact                       # ...with serial / UDID / IMEI / MAC masked\n\nqk apps                                # interactive app picker (sizes stream in live)\nqk apps --uninstall com.example.app    # uninstall a specific app (asks to confirm)\nqk apps --uninstall com.example.app --yes   # ...without the confirmation prompt\n\nqk analyze                             # print the 20 heaviest media files\nqk analyze --top 50                    # ...the heaviest 50 instead\nqk analyze --delete                    # interactive deletion picker (needs a TTY)\n\nqk media                               # camera roll / downloads survey\nqk media -d                            # ...plus likely-duplicate groups\n\nqk logs                                # TUI log viewer (q to quit)\nqk logs --no-tui --min-level warning   # plain-stream mode, warning+ only\nqk logs --no-tui --process SpringBoard --save /tmp/sb.log  # filter + tee\n\nqk reboot                              # asks to confirm\nqk shutdown --yes                      # non-interactive\n\nqk card                                # render a 1080x1080 PNG to ~/Desktop and open in Preview\nqk card --output ~/Pictures/me.png     # custom output path\nqk card --no-open --redact             # don't open Preview, mask anything personal\n\nqk status --json                       # machine-readable output (also: info/apps/analyze/media/devices)\nqk info --redact --json | jq .         # redaction applies before serialization\nqk logs --json                         # NDJSON stream, one JSON object per log line\n```\n\nEvery query command takes `--json`: it prints the same data the GUI consumes,\nso you can pipe quokka into `jq` or another tool. `logs --json` streams NDJSON\n(one object per line); `card` (an image) and `capture` (a live TUI) stay out of\n`--json`.\n\n## Picking a platform and device\n\nquokka autodetects whether you have an iPhone (over `usbmuxd`) or an Android\ndevice (over `adb`) plugged in. Force one with `--platform ios|android` (or the\n`QK_PLATFORM` env var) when both are connected and you want a specific one.\n\nIf you have more than one device plugged in — across either platform — the bare\n`qk` launcher lists them all in a sidebar so you can switch between them. For a\nspecific subcommand, pick which device it talks to:\n\n```sh\nqk devices                              # list every device (iOS + Android) with name + model + id\nqk --udid 00008130-0019... info         # target an iPhone by UDID\nqk --udid ABCD1234 info                 # ...or an Android by adb serial\nQK_UDID=00008130-0019... qk apps        # ...or via env var for a whole shell session\nqk --platform android status            # force the Android backend\n\nqk info                                 # 2+ devices on a TTY: opens an interactive picker\nqk info                                 # 2+ devices in a pipe/CI without --udid: errors with a hint\n```\n\n`--udid` is a global flag that works on every subcommand (long-only; there is\nno `-d` short form because `qk media -d` already means `--find-duplicates`). It\ntakes an iPhone UDID or an Android adb serial, and also reads from `QK_UDID` in\nthe environment, so you can set it once per shell.\n\n## Requirements\n\n- A Mac, with a phone connected via cable.\n\n**For an iPhone:**\n\n- The Xcode command line tools (`xcode-select --install`) supply `usbmuxd`.\n- The device must be trusted: the first time you plug it in, unlock the iPhone\n  and tap _Trust this computer_.\n- iOS 17 or newer.\n\n**For an Android device:**\n\n- `adb` on your `PATH` — `brew install android-platform-tools`.\n- USB debugging enabled (Developer options), and the _Allow USB debugging_\n  prompt accepted for this Mac.\n- Android 8 or newer (so the `adb` shell can read per-app sizes from\n  `dumpsys diskstats` without root).\n- Without root, some fields are best-effort: app names show as package ids,\n  battery health/cycles are unavailable, and packet capture (`qk capture`) is\n  iOS-only.\n\n## Install\n\n### Homebrew (recommended)\n\n```sh\nbrew install dutradotdev/tap/quokka-cli\n```\n\nWorks on Apple Silicon and Intel. `brew upgrade` keeps you on the latest\nrelease.\n\n### One-line installer (no Homebrew)\n\n```sh\ncurl --proto '=https' --tlsv1.2 -LsSf \\\n  https://github.com/dutradotdev/quokka/releases/latest/download/quokka-cli-installer.sh | sh\n```\n\nPulls the prebuilt binary from GitHub Releases into `~/.cargo/bin`. Re-run the\nsame command to update.\n\n### Cargo (build from source)\n\nIf you already have a Rust toolchain:\n\n```sh\ncargo install --git https://github.com/dutradotdev/quokka quokka-cli\n# or, from a local clone:\ncargo install --path crates/quokka-cli\n```\n\nSlower because it compiles locally. Use this when you want to track `main`\nbetween tagged releases.\n\nEvery install method drops two binaries on your `PATH`: `quokka` and the\nshorter `qk`. They share the same code, so `qk status` and `quokka status` do\nthe same thing.\n\n## Development\n\n```sh\ncargo build\ncargo test                  # unit + integration, no iPhone needed\ncargo test --features e2e   # adds tests that need a real iPhone over USB\ncargo test --features e2e-android   # adds tests that need a real Android over adb\ncargo clippy --all-targets -- -D warnings\ncargo fmt\n```\n\nquokka is a Cargo workspace with two crates: **`quokka-core`** (the\npresentation-free `Device` seam, the application facade, and the pure\nprojection/format logic — the crate a GUI would depend on) and **`quokka-cli`**\n(the `quokka`/`qk` binaries and all terminal UI). All `cargo` commands run from\nthe repo root and span the workspace.\n\n- [CONTRIBUTING.md](CONTRIBUTING.md): how to set up, test, and submit a change.\n- [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md): how quokka is put together and why.\n- [CHANGELOG.md](CHANGELOG.md): what changed between versions.\n- [SECURITY.md](SECURITY.md): how to report a vulnerability.\n\nEvery push and pull request runs through [CI](.github/workflows/ci.yml):\nformatting, clippy, the full test suite, `cargo audit`, and `cargo deny`.\n\n## Tested devices\n\nVerified end-to-end on real hardware. OEM quirks (storage reporting, `find`\nflavours) tend to surface here first — if quokka works on a device not listed,\na PR adding a row is welcome.\n\n| Platform | Device               | OS         |\n| -------- | -------------------- | ---------- |\n| iOS      | iPhone 15 Pro Max    | iOS 26.5   |\n| Android  | Redmi Note 9S (MIUI) | Android 12 |\n\n## Acknowledgments\n\n`qk card` ships with [JetBrains Mono](https://github.com/JetBrains/JetBrainsMono)\nembedded in the binary so the rendered PNG looks the same on every machine.\nJetBrains Mono is distributed under the\n[SIL Open Font License 1.1](assets/fonts/OFL.txt); the bundled font files are\nunmodified copies.\n\nBadge artwork uses [Twemoji](https://github.com/jdecked/twemoji) by Twitter\nand contributors, licensed under\n[CC-BY 4.0](https://creativecommons.org/licenses/by/4.0/). The bundled SVGs\nare unmodified copies.\n\n## License\n\nMIT. See [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdutradotdev%2Fquokka","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdutradotdev%2Fquokka","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdutradotdev%2Fquokka/lists"}