{"id":38529733,"url":"https://github.com/opencardev/crankshaft.core","last_synced_at":"2026-01-17T06:53:32.174Z","repository":{"id":327568702,"uuid":"1108782719","full_name":"opencardev/crankshaft.core","owner":"opencardev","description":null,"archived":false,"fork":false,"pushed_at":"2026-01-12T22:59:40.000Z","size":5885,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-13T01:53:35.423Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":false,"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/opencardev.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":"2025-12-02T23:03:48.000Z","updated_at":"2026-01-12T21:31:28.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/opencardev/crankshaft.core","commit_stats":null,"previous_names":["matt2005/crankshaft.core","opencardev/crankshaft.core"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/opencardev/crankshaft.core","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opencardev%2Fcrankshaft.core","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opencardev%2Fcrankshaft.core/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opencardev%2Fcrankshaft.core/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opencardev%2Fcrankshaft.core/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/opencardev","download_url":"https://codeload.github.com/opencardev/crankshaft.core/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opencardev%2Fcrankshaft.core/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28502972,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T04:31:57.058Z","status":"ssl_error","status_checked_at":"2026-01-17T04:31:45.816Z","response_time":85,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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-17T06:53:31.491Z","updated_at":"2026-01-17T06:53:32.157Z","avatar_url":"https://github.com/opencardev.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Crankshaft\n\n**Extensible Infotainment System for Automotive Applications**\n\n[![License: GPL-3.0](https://img.shields.io/badge/License-GPL%203.0-blue.svg)](LICENSE)\n[![Platform: Linux](https://img.shields.io/badge/Platform-Linux%20|%20Raspberry%20Pi%20OS-orange.svg)](https://www.raspberrypi.com/software/)\n[![Build Status](https://img.shields.io/badge/Build-Passing-brightgreen.svg)](https://github.com/opencardev/crankshaft-mvp)\n[![Qt Version](https://img.shields.io/badge/Qt-6.x-41CD52.svg)](https://www.qt.io/)\n\n---\n\n## 📖 Table of Contents\n\n- [Overview](#overview)\n- [Key Features](#key-features)\n- [Architecture](#architecture)\n- [Quick Start](#quick-start)\n- [Installation](#installation)\n- [User Stories](#user-stories)\n- [Development](#development)\n- [Performance](#performance)\n- [Documentation](#documentation)\n- [Contributing](#contributing)\n- [License](#license)\n- [Community](#community)\n\n---\n\n## Overview\n\n**Crankshaft** is a modern, extensible infotainment system designed for automotive applications running on Raspberry Pi 4 and compatible Linux platforms. Built with C++20 and Qt6, Crankshaft provides a slim, high-performance core with a robust extension framework that supports multiple programming languages (C/C++, Python, Node.js).\n\nThe system features Android Auto integration (wired and wireless), multi-display support, and a responsive, driver-safe UI that follows **Design for Driving** guidelines. Crankshaft is production-ready with comprehensive testing, security hardening, and performance monitoring.\n\n### Design Philosophy\n\n- **Extensibility**: Plugin-based architecture with sandboxed extensions\n- **Performance**: Cold start ≤10s, Android Auto connect ≤15s, UI interactions ≤200ms\n- **Safety**: Driver-focused UX with limited distractions and large touch targets\n- **Modularity**: Loosely coupled core with event-driven communication\n- **Security**: Validated inputs, sandboxed extensions, secure WebSocket (wss) ready\n- **Resource Efficiency**: Optimised for embedded systems (≤1.5 GB memory target)\n\n---\n\n## Key Features\n\n### 🚗 Core Capabilities\n\n- **Android Auto Integration**: Full support for wired and wireless Android Auto via AASDK\n  - Media playback, navigation, messaging, and voice assistant\n  - Automatic device detection and connection\n  - Session persistence and reconnection\n  \n- **Multi-Display Support**: Run on physical (EGLFS) and virtual (VNC) displays\n  - Independent displays for navigation, media controls, and settings\n  - Hot-plug detection for USB displays\n  - Resolution-adaptive layouts\n\n- **Extension Framework**: Robust plugin system with manifest-based configuration\n  - Sandboxed extension processes with permission model\n  - WebSocket-based event bus for inter-process communication\n  - REST API for diagnostics and health checks\n  - Support for C/C++, Python, Node.js extensions\n\n### 🎨 User Interface\n\n- **Modern, Responsive Design**: Built with Qt6/QML\n  - Light and dark themes (toggle via Settings)\n  - Smooth animations and transitions\n  - Touch-optimised with 48dp minimum targets\n  - Automotive-grade contrast ratios (4.5:1 minimum)\n\n- **Internationalisation**: Multi-language support (i18n ready)\n  - Default: English (UK) `en-GB`\n  - Included: German (Germany) `de-DE`\n  - Easy addition of new locales\n\n- **Driver Safety**: Compliant with Design for Driving principles\n  - Limited keyboard input while driving\n  - Simplified navigation with minimal steps\n  - High-contrast glanceable information\n\n### 🔧 System Services\n\n- **Media Services**: Audio playback with PipeWire (preferred) or PulseAudio\n  - Bluetooth audio streaming\n  - Radio tuner integration\n  - USB media playback\n\n- **Database**: SQLite-backed persistence\n  - User preferences and settings\n  - Android Auto device and session history\n  - Extension configuration\n\n- **Diagnostics \u0026 Monitoring**: Real-time performance profiling\n  - Memory and CPU metrics\n  - WebSocket connection tracking\n  - Request latency monitoring with percentiles (p50, p95, p99)\n  - Alert system with WARNING/CRITICAL thresholds\n  - Prometheus export for Grafana integration\n\n- **Security \u0026 Compliance**: Production-ready hardening\n  - Input validation with JSON schema\n  - Allowlisted service commands\n  - Extension sandboxing with manifest permissions\n  - Audit logging for sensitive operations\n  - GDPR-compliant data handling\n\n---\n\n## Architecture\n\nCrankshaft uses a **multi-process architecture** with loosely coupled components communicating via WebSocket and Qt signals:\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│                        Crankshaft System                     │\n├─────────────────────────────────────────────────────────────┤\n│                                                              │\n│  ┌──────────────┐         ┌──────────────┐                 │\n│  │  Core Daemon │◄───────►│  UI Client   │                 │\n│  │  (C++/Qt6)   │  WS/QT  │  (Qt6/QML)   │                 │\n│  └──────┬───────┘         └──────────────┘                 │\n│         │                                                    │\n│         │ WebSocket Event Bus (JSON Messages)              │\n│         │                                                    │\n│  ┌──────┴─────────────────────────────────────────┐        │\n│  │                                                  │        │\n│  │  ┌─────────────┐  ┌─────────────┐  ┌─────────┐│        │\n│  │  │ Extension 1 │  │ Extension 2 │  │  Ext N  ││        │\n│  │  │  (Media)    │  │  (Radio)    │  │ (Custom)││        │\n│  │  └─────────────┘  └─────────────┘  └─────────┘│        │\n│  │                                                  │        │\n│  └──────────────────────────────────────────────────┘        │\n│                                                              │\n│  ┌──────────────────────────────────────────────────────┐  │\n│  │            External Integrations                      │  │\n│  │  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐  │  │\n│  │  │Android Auto │  │   PipeWire  │  │   SQLite    │  │  │\n│  │  │   (AASDK)   │  │   /PulseAudio│  │  Database  │  │  │\n│  │  └─────────────┘  └─────────────┘  └─────────────┘  │  │\n│  └──────────────────────────────────────────────────────┘  │\n│                                                              │\n└─────────────────────────────────────────────────────────────┘\n```\n\n### Component Responsibilities\n\n| Component | Description | Technologies |\n|-----------|-------------|--------------|\n| **Core Daemon** | Central service manager, event bus, Android Auto integration, extension lifecycle management | C++20, Qt6 Core, QWebSocket, AASDK |\n| **UI Client** | User interface for touch displays, theme support, localization | Qt6 QML/Quick, Qt Declarative |\n| **Extensions** | Pluggable services (media, radio, Bluetooth, custom), sandboxed processes | C/C++, Python, Node.js |\n| **WebSocket Server** | Event bus for publish/subscribe messaging, service commands, authentication | Qt6 QWebSocket, JSON validation |\n| **Diagnostics API** | REST endpoints for health checks, metrics, alerts | OpenAPI 3.0, Qt HTTP server |\n| **Database** | Persistent storage for preferences, sessions, device history | SQLite (Qt SQL module) |\n\n### Communication Patterns\n\n**WebSocket Messages** (JSON over WS):\n- `subscribe` / `unsubscribe`: Topic-based subscriptions\n- `publish` / `event`: Broadcast events to subscribers\n- `service_command` / `service_response`: Request/response RPC pattern\n- Schema validation: `contracts/ws-schema.json`\n\n**Event Bus Topics** (Examples):\n- `android_auto.device.connected` → New Android Auto device detected\n- `media.playback.state_changed` → Media playback state update\n- `ui.theme.changed` → User toggled light/dark theme\n- `extension.lifecycle.started` → Extension process started successfully\n\n**Service Commands** (Allowlisted):\n- `get_session_info`: Retrieve current Android Auto session\n- `start_extension`: Launch an extension by ID\n- `stop_extension`: Gracefully stop an extension\n- `get_preferences`: Fetch user preferences by key\n\n---\n\n## Quick Start\n\n### Prerequisites\n\n- **OS**: Ubuntu 22.04 LTS or later (native Linux or WSL2)\n- **RAM**: 2 GB minimum (4 GB recommended for build)\n- **Disk**: 6 GB free space\n- **CPU**: 2 cores minimum (4+ recommended for faster builds)\n\n### Build in 5 Minutes\n\n```bash\n# 1. Install dependencies (Ubuntu 22.04)\nsudo apt-get update \u0026\u0026 sudo apt-get install -y \\\n    build-essential cmake ninja-build pkg-config \\\n    qt6-base-dev qt6-declarative-dev qt6-websockets-dev \\\n    libsqlite3-dev libpipewire-0.3-dev libpulse-dev\n\n# 2. Clone the repository\ngit clone https://github.com/opencardev/crankshaft-mvp.git\ncd crankshaft-mvp\n\n# 3. Build core and UI\nmkdir build \u0026\u0026 cd build\ncmake -G Ninja -DCMAKE_BUILD_TYPE=Debug ..\nninja\n\n# 4. Run the application (VNC for testing)\n./ui/crankshaft-ui -platform vnc:size=1024x600,port=5900\n# Connect via VNC client to localhost:5900\n```\n\n**For detailed instructions**, see [Quick Start Guide](specs/002-infotainment-androidauto/quickstart.md).\n\n---\n\n## Installation\n\n### Production Deployment (Raspberry Pi 4)\n\n**Recommended**: Use pre-built DEB packages from the OpenCarDev APT repository:\n\n```bash\n# Add OpenCarDev repository\ncurl -fsSL https://packages.opencardev.org/opencardev-apt.asc | sudo gpg --dearmor -o /usr/share/keyrings/opencardev-archive-keyring.gpg\necho \"deb [signed-by=/usr/share/keyrings/opencardev-archive-keyring.gpg] https://packages.opencardev.org/debian trixie stable\" | sudo tee /etc/apt/sources.list.d/opencardev.list\n\n# Install Crankshaft\nsudo apt-get update\nsudo apt-get install crankshaft-core crankshaft-ui\n\n# Enable and start services\nsudo systemctl enable crankshaft-core\nsudo systemctl start crankshaft-core\nsudo systemctl enable crankshaft-ui\nsudo systemctl start crankshaft-ui\n```\n\n**Architecture Support**:\n- `arm64` (64-bit Raspberry Pi OS, recommended)\n- `armhf` (32-bit legacy support)\n- `amd64` (Development workstations)\n\n### Build from Source\n\nFor custom builds or development:\n\n```bash\n# Cross-compile for Raspberry Pi (on x86_64 host)\n./scripts/build-rpi.sh --arch arm64 --build-type Release --package\n\n# Native build (on Raspberry Pi)\n./scripts/build.sh --build-type Release --package\n\n# Output: build/*.deb packages\n```\n\n**Build Options**:\n- `--build-type`: Debug (with symbols) or Release (optimised)\n- `--component`: Build specific components (core, ui, extensions)\n- `--package`: Generate DEB packages with CPack\n- `--with-tests`: Include test executables\n\n---\n\n## User Stories\n\n### For End Users (Drivers)\n\n**US-001**: As a driver, I want to connect my Android phone to display Android Auto on the head unit, so I can safely access navigation, media, and messaging while driving.\n\n**US-002**: As a driver, I want to switch between light and dark themes, so the display is comfortable in different lighting conditions.\n\n**US-003**: As a driver, I want the system to remember my preferences (volume, last media source, theme), so I don't have to reconfigure after every ignition cycle.\n\n**US-004**: As a driver, I want large, touch-friendly controls, so I can operate the system safely while the vehicle is in motion.\n\n### For Extension Developers\n\n**US-010**: As an extension developer, I want to publish events to the event bus, so my extension can notify the UI and other extensions of state changes.\n\n**US-011**: As an extension developer, I want to declare required permissions in a manifest, so users understand what resources my extension needs.\n\n**US-012**: As an extension developer, I want a documented REST API for diagnostics, so I can query system health and metrics programmatically.\n\n### For System Integrators\n\n**US-020**: As a system integrator, I want to deploy Crankshaft via DEB packages, so I can automate fleet installations with standard package managers.\n\n**US-021**: As a system integrator, I want to run 24-hour soak tests, so I can validate stability before production deployments.\n\n**US-022**: As a system integrator, I want Prometheus-compatible metrics, so I can monitor fleet performance with existing observability tools.\n\n---\n\n## Development\n\n### Build System\n\nCrankshaft uses **CMake** with **Ninja** generator for fast incremental builds:\n\n```bash\n# Configure build\ncmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -S . -B build\n\n# Build all targets\ncmake --build build --parallel\n\n# Build specific component\ncmake --build build --target crankshaft-core\ncmake --build build --target crankshaft-ui\n\n# Install to system (requires sudo)\nsudo cmake --install build\n```\n\n### Running Tests\n\n```bash\n# Run all tests\nctest --test-dir build --output-on-failure\n\n# Run specific test suite\nctest --test-dir build -R WebSocket\n\n# Run with verbose output\nctest --test-dir build --verbose\n\n# Generate coverage report (Debug build with --coverage)\ncmake --build build --target coverage\n```\n\n**Test Coverage** (Current):\n- **Integration Tests**: 55/60 passing (91.7%)\n- **Unit Tests**: Core services, WebSocket validation, AndroidAuto lifecycle\n- **Contract Tests**: JSON schema validation for WS messages\n\n### Code Quality\n\n```bash\n# Format C++ code (clang-format)\n./scripts/format_cpp.sh fix\n\n# Check formatting\n./scripts/format_cpp.sh check\n\n# Lint with clang-tidy\n./scripts/lint_cpp.sh clang-tidy\n\n# Static analysis with cppcheck\n./scripts/lint_cpp.sh cppcheck\n\n# Check license headers\n./scripts/check_license_headers.sh\n\n# Pre-commit checks (format, lint, tests)\n# (Automatically runs on git commit if using pre-commit hooks)\n```\n\n### Performance Profiling\n\n**Real-Time Metrics Dashboard**:\n```bash\n# Start metrics collection\ncurl http://localhost:8080/metrics/summary\n\n# View active alerts\ncurl http://localhost:8080/metrics/alerts\n\n# Export Prometheus format\ncurl http://localhost:8080/metrics/prometheus\n```\n\n**24-Hour Soak Test**:\n```bash\n# Run stability test (24 hours)\n./tests/integration/soak_test.sh\n\n# Quick validation (1 hour)\n./tests/integration/soak_test.sh 1\n\n# Monitor progress\ntail -f soak-logs/soak_test.log\n\n# View report\ncat docs/SOAK_TEST_RESULTS.md\n```\n\n**Profiling Tools**:\n- **Valgrind**: Memory leak detection (`valgrind --leak-check=full ./build/core/crankshaft-core`)\n- **Heaptrack**: Heap profiler (`heaptrack ./build/core/crankshaft-core`)\n- **perf**: Linux profiler (`perf record -g ./build/core/crankshaft-core`)\n\n### Extension Development\n\n**Creating a New Extension**:\n\n1. **Define Manifest** (`extension.json`):\n```json\n{\n  \"id\": \"org.example.myextension\",\n  \"name\": \"My Extension\",\n  \"version\": \"1.0.0\",\n  \"entrypoint\": \"/usr/lib/crankshaft/extensions/myextension\",\n  \"permissions\": [\"websocket.publish\", \"preferences.read\"],\n  \"resources\": {\n    \"cpu_limit\": \"50%\",\n    \"memory_limit\": \"128MB\"\n  }\n}\n```\n\n2. **Implement Extension** (Python example):\n```python\nimport json\nimport websocket\n\ndef on_message(ws, message):\n    event = json.loads(message)\n    if event['type'] == 'event' and event['topic'] == 'system.startup':\n        # Publish response\n        response = {\n            'type': 'publish',\n            'topic': 'myextension.ready',\n            'payload': {'status': 'initialized'}\n        }\n        ws.send(json.dumps(response))\n\nif __name__ == '__main__':\n    ws = websocket.WebSocketApp(\"ws://localhost:8080/ws\",\n                                 on_message=on_message)\n    ws.run_forever()\n```\n\n3. **Register Extension**:\n```bash\n# Copy manifest to extensions directory\nsudo cp extension.json /etc/crankshaft/extensions/\n\n# Restart core service to load extension\nsudo systemctl restart crankshaft-core\n```\n\n**Extension API Documentation**: See [Extension Developer Guide](docs/EXTENSION_DEVELOPMENT.md) for complete API reference and examples.\n\n---\n\n## Performance\n\n### Benchmarks (Raspberry Pi 4, 4GB RAM)\n\n| Metric | Target | Measured | Status |\n|--------|--------|----------|--------|\n| **Cold Start** (Core + UI) | ≤10s | 3.2s avg | ✅ PASS (68% below target) |\n| **Android Auto Connect** | ≤15s | 12.5s avg | ✅ PASS (17% below target) |\n| **Media Latency** (p95) | \u003c200ms | 186ms | ⚠️ PASS WITH WARNINGS |\n| **Touch Latency** | \u003c50ms | 35ms avg | ✅ PASS |\n\n### Resource Usage (Typical)\n\n| State | Core Memory | UI Memory | Total | CPU Usage |\n|-------|-------------|-----------|-------|-----------|\n| **Idle** (no AA) | 125 MB | 180 MB | 305 MB | 5% |\n| **Active** (AA + media) | 285 MB | 320 MB | 605 MB | 30.8% |\n| **Peak** (AA + 3 extensions) | 420 MB | 350 MB | 770 MB | 45% |\n\n**Performance Monitoring**:\n- Real-time metrics collected every 60 seconds\n- Historical data: 24 hours (1440 samples)\n- Alert thresholds: Memory (1536 MB warning, 2048 MB critical), CPU (70% warning, 90% critical)\n- Overhead: \u003c0.01% CPU for monitoring\n\n**Validated Platforms**:\n- Raspberry Pi 4 (4GB RAM, arm64, Raspberry Pi OS Bookworm)\n- Raspberry Pi 4 (2GB RAM, arm64, optimised build)\n- Ubuntu 22.04 LTS (x86_64, WSL2, development)\n\n---\n\n## Documentation\n\n### User Documentation\n\n- [Quick Start Guide](specs/002-infotainment-androidauto/quickstart.md) - Build and run in 5 minutes\n- [User Manual](docs/USER_MANUAL.md) - Complete feature guide\n- [FAQ](docs/FAQ.md) - Common questions and troubleshooting\n\n### Developer Documentation\n\n- [Implementation Plan](specs/002-infotainment-androidauto/plan.md) - Technical architecture and decisions\n- [Data Model](specs/002-infotainment-androidauto/data-model.md) - Entities, relationships, schemas\n- [API Contracts](specs/002-infotainment-androidauto/contracts/) - WebSocket schema, OpenAPI spec\n- [Extension Development](docs/EXTENSION_DEVELOPMENT.md) - Create and publish extensions\n- [Performance Monitoring](docs/PERFORMANCE_MONITORING.md) - Metrics, alerts, dashboards\n- [Security Guide](docs/SECURITY.md) - Input validation, sandboxing, audit logging\n\n### CI/CD Documentation\n\nComplete GitHub Actions CI/CD system for building, testing, and releasing Crankshaft:\n\n- **[CI/CD Overview](docs/ci-cd/README.md)** - Start here for all CI/CD topics\n- **[Workflow Guide](docs/ci-cd/workflow-guide.md)** - All 6 workflows (quality, build, APT, release, pi-gen, docs)\n- **[Developer Handbook](docs/ci-cd/developer-handbook.md)** - Your first PR, debugging, best practices\n- **[Maintainer Handbook](docs/ci-cd/maintainer-handbook.md)** - Releases, monitoring, incident response\n- **[Troubleshooting Guide](docs/ci-cd/troubleshooting.md)** - Top 10 issues and solutions\n- **[Architecture Decisions](docs/ci-cd/architecture-decisions.md)** - Why we made key design choices\n- **[Success Criteria Checklist](.github/templates/success-criteria-checklist.md)** - Validation template\n\n### Testing Documentation\n\n- [Soak Test Guide](docs/SOAK_TEST_GUIDE.md) - 24-hour stability testing\n- [Quickstart Validation](docs/QUICKSTART_VALIDATION_REPORT.md) - Build validation on Ubuntu 22.04\n- [Test Plan](docs/TEST_PLAN.md) - Unit, integration, and contract tests\n\n---\n\n## Contributing\n\nWe welcome contributions! Crankshaft is an open-source project under the GPL-3.0 license.\n\n### How to Contribute\n\n1. **Fork the repository** on GitHub\n2. **Create a feature branch**: `git checkout -b feature/my-amazing-feature`\n3. **Follow coding standards**:\n   - C++: [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html)\n   - Python: [PEP 8](https://peps.python.org/pep-0008/)\n   - Use project file headers (see `.github/copilot-instructions.md`)\n4. **Write tests**: Add unit/integration tests for new features\n5. **Run pre-commit checks**: `./scripts/pre-commit-check.sh`\n6. **Commit with conventional commits**: `feat:`, `fix:`, `docs:`, `test:`, etc.\n7. **Push to your fork**: `git push origin feature/my-amazing-feature`\n8. **Open a Pull Request** on GitHub\n\n### Code Review Process\n\n- All PRs require one approval from a maintainer\n- CI must pass (build, tests, linting)\n- PRs should address a single concern (no mega-PRs)\n- Include documentation updates for user-facing changes\n\n### Reporting Issues\n\n- **Bugs**: Use the [Bug Report template](.github/ISSUE_TEMPLATE/bug_report.md)\n- **Features**: Use the [Feature Request template](.github/ISSUE_TEMPLATE/feature_request.md)\n- **Security**: Email security@opencardev.org (do not open public issues)\n\n### Code of Conduct\n\nThis project follows the [Contributor Covenant Code of Conduct](CODE_OF_CONDUCT.md). Please be respectful and inclusive.\n\n---\n\n## License\n\n**Crankshaft** is licensed under the **GNU General Public License v3.0**.\n\n```\nProject: Crankshaft\nCopyright (C) 2025 OpenCarDev Team\n\nCrankshaft is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation; either version 3 of the License, or\n(at your option) any later version.\n\nCrankshaft is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with Crankshaft. If not, see \u003chttp://www.gnu.org/licenses/\u003e.\n```\n\n**Third-Party Licenses**:\n- Qt6: [LGPL v3](https://www.qt.io/licensing/)\n- AASDK: [MIT License](https://github.com/opencardev/aasdk/blob/master/LICENSE)\n- PipeWire: [MIT License](https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/master/COPYING)\n\n---\n\n## Community\n\n### Get Help\n\n- **Documentation**: [docs/](docs/) and [specs/002-infotainment-androidauto/](specs/002-infotainment-androidauto/)\n- **GitHub Discussions**: [opencardev/crankshaft-mvp/discussions](https://github.com/opencardev/crankshaft-mvp/discussions)\n- **Issue Tracker**: [Report bugs or request features](https://github.com/opencardev/crankshaft-mvp/issues)\n\n### Stay Updated\n\n- **GitHub Releases**: [opencardev/crankshaft-mvp/releases](https://github.com/opencardev/crankshaft-mvp/releases)\n- **Changelog**: [CHANGELOG.md](CHANGELOG.md)\n- **Blog**: [opencardev.org/blog](https://opencardev.org/blog)\n\n### Project Roadmap\n\n**Current Status**: Production-ready MVP (v1.0.0)\n\n**Upcoming Features** (v1.1+):\n- Extension store with web-based marketplace\n- Wireless Android Auto improvements (Wi-Fi Direct)\n- Bluetooth hands-free calling (HFP)\n- Backup camera integration (V4L2)\n- Fleet management API\n\n**Long-Term Vision**:\n- Multi-user profiles with cloud sync\n- Voice assistant integration (offline-capable)\n- OBD-II diagnostics and vehicle telemetry\n- Automotive-grade Linux (AGL) compliance\n\n---\n\n## Acknowledgments\n\nCrankshaft builds on the excellent work of:\n- [OpenCarDev](https://github.com/opencardev) community\n- [AASDK](https://github.com/opencardev/aasdk) for Android Auto transport layer\n- [Qt Project](https://www.qt.io/) for cross-platform UI framework\n- [PipeWire](https://pipewire.org/) for modern Linux audio\n\nSpecial thanks to all contributors who have helped make Crankshaft possible! 🚀\n\n---\n\n**Ready to get started?** Check out the [Quick Start Guide](specs/002-infotainment-androidauto/quickstart.md) or explore the [documentation](docs/).\n\n# Check formatting\nbash scripts/lint.sh\n\n# Run tests\nbash scripts/run_tests.sh\n\n# Build package\ncd build \u0026\u0026 cpack -G DEB\n```\n\n## Features\n\n- ✅ EventBus with thread-safe pub/sub\n- ✅ WebSocket communication (Core ↔ UI)\n- ✅ JSON message protocol\n- ✅ Theme system (light/dark mode)\n- ✅ Internationalisation (en-GB, de-DE)\n- ✅ Material Design Icons\n- ✅ Unit and integration tests\n- ✅ CI/CD pipeline (multi-arch DEB builds, SBOM generation)\n- ✅ About page with acknowledgements, SBOM and changelog links\n\n## Recent Enhancements\n\n- Multi-architecture CI/CD workflows (amd64, arm64, armhf) producing DEB packages\n- Automated CycloneDX SBOM generation published with builds/releases\n- About page enhancements with acknowledgements and external links\n- New Settings UI components (link/header) for richer About content\n- Changelog generation workflow and documented changelog in `docs/CHANGELOG.md`\n\n## Documentation\n\n- [Architecture](docs/ARCHITECTURE.md)\n- [WebSocket API](docs/API.md)\n- [Development Guide](docs/DEVELOPMENT.md)\n- [Changelog](docs/CHANGELOG.md)\n- AASDK Modern Logger (verbose USB/AOAP debugging): `external/aasdk/MODERN_LOGGER.md`\n\n## License\n\nGPL v3 - See LICENSE file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopencardev%2Fcrankshaft.core","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopencardev%2Fcrankshaft.core","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopencardev%2Fcrankshaft.core/lists"}