{"id":48678578,"url":"https://github.com/greensyntax/droid-duck-mac","last_synced_at":"2026-04-10T21:01:39.602Z","repository":{"id":346413331,"uuid":"1189577153","full_name":"greenSyntax/droid-duck-mac","owner":"greenSyntax","description":"Mac FileExplorer for Android 📂","archived":false,"fork":false,"pushed_at":"2026-03-23T18:47:13.000Z","size":1382,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-24T16:57:12.966Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/greenSyntax.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"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-03-23T13:12:54.000Z","updated_at":"2026-03-23T18:47:17.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/greenSyntax/droid-duck-mac","commit_stats":null,"previous_names":["greensyntax/droid-duck-mac"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/greenSyntax/droid-duck-mac","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/greenSyntax%2Fdroid-duck-mac","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/greenSyntax%2Fdroid-duck-mac/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/greenSyntax%2Fdroid-duck-mac/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/greenSyntax%2Fdroid-duck-mac/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/greenSyntax","download_url":"https://codeload.github.com/greenSyntax/droid-duck-mac/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/greenSyntax%2Fdroid-duck-mac/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31658964,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T17:19:37.612Z","status":"ssl_error","status_checked_at":"2026-04-10T17:19:13.364Z","response_time":98,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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-04-10T21:01:35.142Z","updated_at":"2026-04-10T21:01:39.595Z","avatar_url":"https://github.com/greenSyntax.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DroidDuck - Mac File Explorer for Android \n\nA native macOS file explorer for connected Android devices, built with Swift and SwiftUI. Browse, preview, and download files from your Android phone or tablet directly from your Mac — no third-party apps required.\n\n![Alt Text](dist/app.png)\n\n---\n\n## Features\n\n### Device Management\n- Auto-detects connected Android devices via ADB (Android Debug Bridge)\n- Polls every 3 seconds for device connect / disconnect events\n- Displays device model name and connection status (Connected, Unauthorized, Offline, Recovery)\n- Prompts to authorize USB debugging when a device is Unauthorized\n- Auto-installs ADB via Homebrew if not found, with a live streaming install log\n\n### File Browser\n- Starts in `/sdcard` (Internal Storage) by default — just like other Android file explorers\n- Full back / forward navigation history\n- Breadcrumb bar showing the current path with clickable segments\n- Refresh with ⌘R\n- Item count displayed in the toolbar\n- System files marked with a lock badge and muted colour so they stand out\n\n### Three View Modes\n\n**List View** — Classic compact rows with file name, size, and date columns. Sorted directories-first, then alphabetically.\n\n**Tree View** — Expandable directory tree. Children are loaded lazily on first expand. Collapse all with one click.\n\n**Card View** — Square grid of cards. Image files (JPG, PNG, HEIC, WEBP, GIF, BMP, TIFF) display a live thumbnail pulled from the device. Other file types show a large colour-coded icon with an extension badge. Thumbnails load lazily as cards scroll into view, with a max of 4 concurrent downloads.\n\n### Locations Sidebar\nQuick-jump links to the most-used Android paths:\n- Internal Storage (`/sdcard`)\n- Downloads, Camera, Pictures, Music, Movies, Documents\n- WhatsApp folder\n- Android data folder\n- Root (`/`)\n\n### File Search\n- ⌘F to activate, Esc to dismiss\n- Debounced (400 ms) — no ADB spam on every keystroke\n- Searches the current directory recursively via `adb shell find`\n- Results grouped directories-first, each showing its parent path\n- Right-click on any result for the full context menu\n\n### Image Preview\nDouble-click any image file to open DroidDuck's built-in preview without leaving the app:\n- Smooth scroll-wheel / trackpad zoom\n- Double-click image to toggle Fit ↔ Actual Size (100%)\n- Zoom In / Out buttons with live percentage readout\n- Copy image to clipboard\n- Reveal temp file in Finder\n- Image dimensions shown (e.g. 4032 × 3024 px)\n\n### Open in System App\nRight-click any supported file → **Open in System App** to pull the file and open it in the macOS default handler:\n\n| Type | Opens In |\n|---|---|\n| Images (JPG, PNG, HEIC, WEBP…) | Preview / Photos |\n| PDF | Preview |\n| Audio (MP3, AAC, FLAC, WAV…) | Music / QuickTime |\n| Video (MP4, MOV, MKV, AVI…) | QuickTime Player |\n| Text / Code (TXT, JSON, Swift, Python…) | TextEdit / default editor |\n| Documents (DOCX, Pages, ODT) | Pages / Word |\n| Spreadsheets (XLSX, Numbers, ODS) | Numbers / Excel |\n\nA status banner slides up from the bottom of the window while the file is downloading, with an error state that auto-dismisses after 5 seconds.\n\n### Download to Mac\nRight-click any file → **Download to Mac** to save it to your `~/Downloads` folder. Automatically renames the file if one with the same name already exists. Reveals the saved file in Finder when done.\n\n### Context Menu (right-click any file or folder)\n- Quick Preview (images)\n- Open in System App\n- Download to Mac\n- Copy Path / Copy Name\n- Get Info (full metadata sheet: permissions, owner, group, size, date, symlink target)\n- Rename *(coming soon)*\n- Delete *(coming soon)*\n\n### Diagnostics\n**Help → Diagnostics** (⌘⌥D) shows a colour-coded report:\n- macOS version\n- App Sandbox status\n- Homebrew path\n- ADB binary path and version\n- ADB daemon status\n- Connected devices\n- Common path accessibility scan\n\n---\n\n## Requirements\n\n| | |\n|---|---|\n| **macOS** | 13 Ventura or later |\n| **Xcode** | 15 or later |\n| **ADB** | Installed automatically via Homebrew, or manually |\n| **Android device** | USB debugging enabled |\n\n### Enable USB Debugging on Android\n1. Go to **Settings → About Phone**\n2. Tap **Build Number** 7 times to unlock Developer Options\n3. Go to **Settings → Developer Options**\n4. Enable **USB Debugging**\n5. Connect via USB and tap **Allow** when prompted on the device\n\n---\n\n## Installation\n\n### 1. Clone the repository\n```bash\ngit clone https://github.com/greenSyntax/droid-duck-mac.git\ncd DroidDuck\n```\n\n### 2. Open in Xcode\n```bash\nopen DroidDuck/DroidDuck.xcodeproj\n```\n\n### 3. Disable App Sandbox (required for ADB subprocess)\nIn Xcode, select the **DroidDuck** target → **Signing \u0026 Capabilities** → remove the **App Sandbox** capability. Without this, macOS will block the ADB subprocess from running.\n\n### 4. Build \u0026 Run\nSelect your Mac as the run destination and press ⌘R.\n\n### ADB Setup\nDroidDuck looks for ADB in these locations in order:\n1. `/opt/homebrew/bin/adb` (Homebrew, Apple Silicon)\n2. `/usr/local/bin/adb` (Homebrew, Intel)\n3. `~/Library/Android/sdk/platform-tools/adb` (Android Studio)\n4. `~/Android/sdk/platform-tools/adb`\n5. `/usr/bin/adb`\n6. Output of `which adb` (covers custom PATH entries)\n\nIf ADB is not found and Homebrew is installed, DroidDuck offers to install it automatically. If Homebrew is not installed, the empty state shows manual install instructions.\n\n**Manual install:**\n```bash\n# Homebrew (recommended)\nbrew install --cask android-platform-tools\n\n# Or download platform-tools directly from Google:\n# https://developer.android.com/tools/releases/platform-tools\n```\n\n---\n\n## Project Structure\n\n```\nDroidDuck/\n├── DroidDuckApp.swift          # App entry point, menus\n├── Models/\n│   ├── DeviceInfo.swift        # Device model + status enum\n│   └── FileNode.swift          # File/folder model, ls parser, openable categories\n├── Services/\n│   ├── ADBService.swift        # ADB actor: list devices, list directory, pull, search\n│   └── DeviceManager.swift     # Device polling, Homebrew install orchestration\n├── ViewModels/\n│   └── FileBrowserViewModel.swift  # Navigation, search, tree, thumbnails, open/download state\n└── Views/\n    ├── ContentView.swift           # NavigationSplitView root\n    ├── Sidebar/\n    │   └── DeviceSidebarView.swift # Devices + Locations panel\n    ├── Browser/\n    │   ├── FileBrowserView.swift   # Toolbar, breadcrumbs, search bar, content routing\n    │   ├── FileRowView.swift       # List view row\n    │   ├── TreeBrowserView.swift   # Tree view + TreeRowView\n    │   ├── CardBrowserView.swift   # Card grid + thumbnail loading\n    │   └── ImagePreviewView.swift  # Full image preview sheet\n    └── Shared/\n        ├── DiagnosticsView.swift   # Diagnostics report sheet\n        ├── EmptyStateView.swift    # No-ADB / no-device empty state\n        └── FileActionBanner.swift  # Download / open status banner\n```\n\n---\n\n## Keyboard Shortcuts\n\n| Shortcut | Action |\n|---|---|\n| ⌘R | Refresh current directory |\n| ⌘[ | Go back |\n| ⌘] | Go forward |\n| ⌘F | Activate search |\n| Esc | Dismiss search |\n| ⌘⇧R | Refresh device list |\n| ⌘⌥D | Open Diagnostics |\n\n---\n\n## Known Limitations\n\n- **Write operations** (rename, delete, new folder) are not yet implemented\n- **APK installation** is not yet supported\n- Directories cannot be downloaded as a zip (file-only download for now)\n- Very large video files may take a while to pull before opening in QuickTime\n\n---\n\n## License\n\nMIT License. See [LICENSE](LICENSE) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgreensyntax%2Fdroid-duck-mac","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgreensyntax%2Fdroid-duck-mac","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgreensyntax%2Fdroid-duck-mac/lists"}