{"id":36679510,"url":"https://github.com/halffd/devlist","last_synced_at":"2026-01-20T06:00:37.419Z","repository":{"id":327828002,"uuid":"1110956004","full_name":"Halffd/DevList","owner":"Halffd","description":"App to show devices list on mobile","archived":false,"fork":false,"pushed_at":"2026-01-09T20:16:02.000Z","size":443,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-12T18:09:30.135Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Halffd.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2025-12-06T01:48:58.000Z","updated_at":"2026-01-09T20:13:26.000Z","dependencies_parsed_at":null,"dependency_job_id":"05eda664-9086-4c65-827c-809efffe2022","html_url":"https://github.com/Halffd/DevList","commit_stats":null,"previous_names":["halffd/devlist"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/Halffd/DevList","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Halffd%2FDevList","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Halffd%2FDevList/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Halffd%2FDevList/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Halffd%2FDevList/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Halffd","download_url":"https://codeload.github.com/Halffd/DevList/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Halffd%2FDevList/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28597087,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-20T02:08:49.799Z","status":"ssl_error","status_checked_at":"2026-01-20T02:08:44.148Z","response_time":117,"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-01-12T10:56:09.559Z","updated_at":"2026-01-20T06:00:37.397Z","avatar_url":"https://github.com/Halffd.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DevList 📱\n\nA React Native application for detecting device hardware capabilities, with focus on audio connectivity and battery monitoring.\n\n[![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-blue.svg)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)\n[![React Native](https://img.shields.io/badge/React%20Native-0.82-blue.svg)](https://reactnative.dev/)\n[![Platform](https://img.shields.io/badge/Platform-Android%20%7C%20iOS-green.svg)](https://reactnative.dev/)\n\n## Overview\n\nDevList helps developers and users understand their device's hardware capabilities, particularly around audio connectivity. Born from the frustration of the headphone jack removal era (2016-present), this utility provides programmatic access to device features that used to be taken for granted.\n\n## Features ✨\n\n### Core Functionality\n- 🎧 **Headphone Jack Detection** - Determines if device has physical 3.5mm audio port\n- 🔌 **Audio Output Status** - Real-time monitoring of wired/Bluetooth headphone connections\n- 🔋 **Battery Monitoring** - Track battery level and charging state\n- 📊 **Device Information** - Aggregate hardware capabilities in one call\n- 💡 **Smart Recommendations** - Suggests accessories based on device limitations\n\n### Platform Support\n- ✅ Android (tested on 5.0+)\n- ✅ iOS (tested on 11.0+)\n- ✅ Expo compatible (with custom dev client)\n\n## Installation 🚀\n\n### Prerequisites\n- Node.js \u003e= 18\n- React Native CLI or Expo\n- Java 21 (for Android builds)\n- Android Studio or Xcode\n\n### Setup\n\n```bash\n# Clone repository\ngit clone https://github.com/yourusername/DevList.git\ncd DevList\n\n# Install dependencies\nnpm install\n\n# iOS only - Install CocoaPods dependencies\ncd ios \u0026\u0026 pod install \u0026\u0026 cd ..\n\n# Start Metro bundler\nnpm start\n\n```\n\n### Run on Device\n\n```bash\n# Android\nnpm run android\n\n# iOS\nnpm run ios\n\n```\n\n## Usage 📖\n\n### Basic Example\n\n```javascript\nimport React, { useEffect, useState } from 'react';\nimport { View, Text, StyleSheet } from 'react-native';\nimport DeviceDetector from './DeviceDetector';\n\nexport default function App() {\n  const [deviceInfo, setDeviceInfo] = useState(null);\n  const [status, setStatus] = useState(null);\n\n  useEffect(() =\u003e {\n    async function loadDeviceInfo() {\n      const info = await DeviceDetector.getDeviceInfo();\n      const statusMsg = await DeviceDetector.getStatusMessage();\n\n      setDeviceInfo(info);\n      setStatus(statusMsg);\n    }\n\n    loadDeviceInfo();\n  }, []);\n\n  if (!deviceInfo) return \u003cText\u003eLoading...\u003c/Text\u003e;\n\n  return (\n    \u003cView style={styles.container}\u003e\n      \u003cText style={styles.title}\u003eDevice Info\u003c/Text\u003e\n\n      \u003cText\u003eModel: {deviceInfo.model}\u003c/Text\u003e\n      \u003cText\u003ePlatform: {deviceInfo.platform}\u003c/Text\u003e\n      \u003cText\u003eHas Headphone Jack: {deviceInfo.hasHeadphoneJack ? '✅' : '❌'}\u003c/Text\u003e\n      \u003cText\u003eHeadphones Connected: {deviceInfo.headphonesConnected ? '✅' : '❌'}\u003c/Text\u003e\n      \u003cText\u003eBattery: {deviceInfo.batteryLevel}%\u003c/Text\u003e\n      \u003cText\u003eCharging: {deviceInfo.isCharging ? '⚡' : '🔋'}\u003c/Text\u003e\n\n      {status?.recommendation \u0026\u0026 (\n        \u003cText style={styles.recommendation}\u003e\n          💡 {status.recommendation}\n        \u003c/Text\u003e\n      )}\n    \u003c/View\u003e\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: { flex: 1, padding: 20, justifyContent: 'center' },\n  title: { fontSize: 24, fontWeight: 'bold', marginBottom: 20 },\n  recommendation: { marginTop: 20, fontStyle: 'italic', color: '#666' }\n});\n\n```\n\n### API Reference\n\n#### `DeviceDetector.hasHeadphoneJack()`\nReturns `boolean` indicating if device has physical 3.5mm port (synchronous).\n\n#### `DeviceDetector.isHeadphonesConnected()`\nReturns `Promise\u003cboolean\u003e` - true if any audio device is connected.\n\n#### `DeviceDetector.getBatteryLevel()`\nReturns `Promise\u003cnumber\u003e` - battery percentage (0-100).\n\n#### `DeviceDetector.isCharging()`\nReturns `Promise\u003cboolean\u003e` - true if device is currently charging.\n\n#### `DeviceDetector.getDeviceInfo()`\nReturns comprehensive device information:\n```typescript\n{\n  hasHeadphoneJack: boolean;\n  headphonesConnected: boolean;\n  batteryLevel: number;\n  isCharging: boolean;\n  isAudioPlaying: boolean;\n  platform: 'ios' | 'android';\n  model: string;\n}\n\n```\n\n#### `DeviceDetector.getStatusMessage()`\nReturns user-friendly status messages and recommendations:\n```typescript\n{\n  audio: string;\n  battery: string;\n  recommendation: string | null;\n}\n\n```\n\n## Building for Production 🏗️\n\n### Android\n\n```bash\n# Generate signing key (first time only)\nkeytool -genkeypair -v \\\n  -storetype PKCS12 \\\n  -keystore android/app/release-key.keystore \\\n  -alias my-key-alias \\\n  -keyalg RSA \\\n  -keysize 2048 \\\n  -validity 10000\n\n# Add to ~/.gradle/gradle.properties\nMYAPP_RELEASE_STORE_FILE=release-key.keystore\nMYAPP_RELEASE_KEY_ALIAS=my-key-alias\nMYAPP_RELEASE_STORE_PASSWORD=your_password\nMYAPP_RELEASE_KEY_PASSWORD=your_password\n\n# Build release APK\ncd android\n./gradlew assembleRelease\n\n# Output: android/app/build/outputs/apk/release/app-release.apk\n\n```\n\n### iOS\n\nOpen `ios/DevList.xcworkspace` in Xcode, select Generic iOS Device, then Product \u003e Archive.\n\n## Dependencies 📦\n\n```json\n{\n  \"react-native-device-info\": \"^10.14.0\"\n}\n\n```\n\nSee `package.json` for complete dependency list.\n\n## Architecture 🏛️\n\n```\nDevList/\n├── App.js                    # Main application entry point\n├── DeviceDetector.js         # Core detection utility (platform-agnostic)\n├── android/                  # Android native configuration\n│   ├── app/\n│   │   ├── build.gradle      # Build configuration\n│   │   └── src/              # Native Android code\n│   └── gradle.properties     # Build properties\n├── ios/                      # iOS native configuration\n├── node_modules/             # Dependencies\n└── package.json              # Project metadata\n\n```\n\n## Troubleshooting 🔧\n\n### Common Issues\n\n**Metro bundler port conflict**\n```bash\nlsof -ti:8081 | xargs kill -9\nnpm start -- --reset-cache\n\n```\n\n**Android build fails with CMake errors**\n```bash\nrm -rf android/.gradle android/app/build node_modules\nnpm install\ncd android \u0026\u0026 ./gradlew clean\n\n```\n\n**Keystore password incorrect**\nVerify credentials in `~/.gradle/gradle.properties` or regenerate keystore (non-production only).\n\n## Contributing 🤝\n\nContributions are welcome! This project is licensed under GPL v2.0, which means:\n\n1. Fork the repository\n2. Create your feature branch (`git checkout -b feat/amazing-feature`)\n3. Follow conventional commits (`feat:`, `fix:`, `docs:`, etc.)\n4. Ensure your code is GPL v2.0 compatible\n5. Submit a Pull Request\n\nAny modifications or derivatives must also be released under GPL v2.0.\n\n## License 📜\n\nCopyright (C) 2025 DevList Contributors\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\nSee [LICENSE](LICENSE) for full details.\n\n## The Headphone Jack Saga 📖\n\nThis project exists as a response to the 2016-present trend of removing the 3.5mm headphone jack from smartphones. What was marketed as \"courage\" and \"innovation\" created real usability problems:\n\n- Inability to charge while using wired audio\n- Forced adoption of Bluetooth with inherent latency\n- Additional dongles and adapters required\n- E-waste from incompatible accessories\n\nDevList provides developers tools to detect these limitations and recommend solutions to affected users.\n\n## Acknowledgments 🙏\n\n- React Native community\n- Contributors to react-native-device-info\n- The /g/ community for documenting hardware regressions since 2016\n- Everyone who refused to accept \"you're holding it wrong\"\n\n## Contact \u0026 Support 📧\n\n- **Issues**: [GitHub Issues](https://github.com/yourusername/DevList/issues)\n- **Discussions**: [GitHub Discussions](https://github.com/yourusername/DevList/discussions)\n- **Pull Requests**: Always welcome!\n\n---\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhalffd%2Fdevlist","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhalffd%2Fdevlist","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhalffd%2Fdevlist/lists"}