[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M752XT54VT5E95QASFX7F8JR":3,"skill-same:01M752XT54VT5E95QASFX7F8JR":46},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":14,"repositoryHtmlUrl":27,"repositoryHomepageUrl":6,"ownerHtmlUrl":28,"ownerBlogUrl":29,"ownerDescription":30,"updatedAt":31,"install":32,"resources":45},"01M752XT54VT5E95QASFX7F8JR","hl-build-standalone-app",null,"Build a complete standalone app using HailoInfer + OpenCV on Hailo-8\u002F8L\u002F10H.","TejasLamba2006\u002Fhailo-apps","TejasLamba2006","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F73745640?v=4","01M752WBF8KHM6KJTEQXTJZR9K","Tejas Lamba","01M752WBGE2NS66C4ENRHWY36S",0,"MIT","https:\u002F\u002Fgithub.com\u002FTejasLamba2006\u002Fhailo-apps\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fhl-build-standalone-app\u002FSKILL.md",[],[],"2026-11-12 13:55:43",false,"---\nname: hl-build-standalone-app\ndescription: Build a complete standalone app using HailoInfer + OpenCV on Hailo-8\u002F8L\u002F10H.\n---\n\n# Skill: Build Standalone Inference Application\n\nBuild a complete standalone app using HailoInfer + OpenCV on Hailo-8\u002F8L\u002F10H.\n\n## When This Skill Is Loaded\n\n- User wants **direct inference** without GStreamer\n- User mentions: OpenCV, HailoInfer, standalone, batch processing, custom pipeline\n- User needs **full control** over preprocessing and postprocessing\n\n## Reference Implementations\n\nStudy `hailo_apps\u002Fpython\u002Fstandalone_apps\u002Fobject_detection\u002F` — the canonical standalone app:\n- `object_detection.py` — 3-thread architecture, HailoInfer, queue-based\n- Also see: `pose_estimation\u002F`, `instance_segmentation\u002F`, `lane_detection\u002F`\n\n## Build Process\n\n### Step 1: Create App Directory\n\nCreate the app directory:\n\n```\nhailo_apps\u002Fpython\u002F\u003Ctype>\u002F\u003Capp_name>\u002F\n├── app.yaml              # App manifest (type: standalone)\n├── run.sh                # Launch wrapper\n├── __init__.py\n├── \u003Capp_name>.py         # Main app (3-thread architecture)\n├── \u003Capp_name>_post_process.py  # Custom postprocessing\n├── config.json           # Labels, thresholds (optional)\n└── README.md             # Usage documentation (REQUIRED — never skip)\n```\n\nCreate `app.yaml` with `type: standalone` and `run.sh` wrapper.\nDo NOT register in `defines.py` or `resources_config.yaml`.\n\n### Step 2: Build Main App (3-Thread Architecture)\n\n```python\nimport threading\nimport queue\nimport signal\nimport cv2\nimport numpy as np\n\nfrom hailo_apps.python.core.common.hailo_logger import get_logger\nfrom hailo_apps.python.core.common.core import resolve_hef_path, handle_and_resolve_args\nfrom hailo_apps.python.core.common.parser import get_standalone_parser\nfrom hailo_apps.python.core.common.hailo_inference import HailoInfer\n\nlogger = get_logger(__name__)\n\nAPP_NAME = \"my_standalone_app\"\nMAX_INPUT_QUEUE_SIZE = 5\nMAX_OUTPUT_QUEUE_SIZE = 5\nMAX_ASYNC_INFER_JOBS = 3\n\n\ndef preprocess_thread(cap, input_queue, hailo_infer, stop_event):\n    height, width, _ = hailo_infer.get_input_shape()\n    while not stop_event.is_set():\n        ret, frame = cap.read()\n        if not ret:\n            break\n        resized = cv2.resize(frame, (width, height))\n        input_queue.put((frame, resized))\n    input_queue.put(None)\n\n\ndef infer_thread(hailo_infer, input_queue, output_queue, stop_event):\n    while not stop_event.is_set():\n        item = input_queue.get()\n        if item is None:\n            break\n        frame, preprocessed = item\n        results = hailo_infer.run(preprocessed)\n        output_queue.put((frame, results))\n    output_queue.put(None)\n\n\ndef postprocess_thread(output_queue, stop_event, no_display):\n    while not stop_event.is_set():\n        item = output_queue.get()\n        if item is None:\n            break\n        frame, results = item\n        # Custom postprocessing here\n        if not no_display:\n            cv2.imshow(\"Output\", frame)\n            if cv2.waitKey(1) & 0xFF == ord('q'):\n                stop_event.set()\n\n\ndef main():\n    parser = get_standalone_parser()\n    args = parser.parse_args()\n    args = handle_and_resolve_args(args, APP_NAME)\n\n    stop_event = threading.Event()\n    signal.signal(signal.SIGINT, lambda s, f: stop_event.set())\n\n    hailo_infer = HailoInfer(str(args.hef_path), args.batch_size)\n    cap = cv2.VideoCapture(args.input)\n\n    input_q = queue.Queue(maxsize=MAX_INPUT_QUEUE_SIZE)\n    output_q = queue.Queue(maxsize=MAX_OUTPUT_QUEUE_SIZE)\n\n    threads = [\n        threading.Thread(target=preprocess_thread, args=(cap, input_q, hailo_infer, stop_event)),\n        threading.Thread(target=infer_thread, args=(hailo_infer, input_q, output_q, stop_event)),\n        threading.Thread(target=postprocess_thread, args=(output_q, stop_event, args.no_display)),\n    ]\n\n    try:\n        for t in threads:\n            t.start()\n        for t in threads:\n            t.join()\n    finally:\n        hailo_infer.close()\n        cap.release()\n        cv2.destroyAllWindows()\n\n\nif __name__ == \"__main__\":\n    main()\n```\n\n### Step 4: Validate\n\n```bash\npython3 .github\u002Fscripts\u002Fvalidate_app.py hailo_apps\u002Fpython\u002Fstandalone_apps\u002Fmy_standalone_app --smoke-test\n```\n\n## Critical Conventions\n\n1. **CLI parser**: `get_standalone_parser()` — includes `--input`, `--hef-path`, `--batch-size`, `--no-display`, `--save-output`\n2. **HEF resolution**: `handle_and_resolve_args(args, APP_NAME)`\n3. **3-thread pattern**: preprocess → infer → postprocess, connected by `queue.Queue`\n4. **Queue sentinel**: `queue.put(None)` to signal thread termination\n5. **Async inference**: Limit concurrent jobs with `MAX_ASYNC_INFER_JOBS`\n6. **Cleanup**: Always `hailo_infer.close()` in finally block\n7. **Stop event**: `threading.Event()` for graceful shutdown\n8. **Signal handler**: Register SIGINT to set stop_event\n\n","# Skill: Build Standalone Inference Application\n\nBuild a complete standalone app using HailoInfer + OpenCV on Hailo-8\u002F8L\u002F10H.\n\n## When This Skill Is Loaded\n\n- User wants **direct inference** without GStreamer\n- User mentions: OpenCV, HailoInfer, standalone, batch processing, custom pipeline\n- User needs **full control** over preprocessing and postprocessing\n\n## Reference Implementations\n\nStudy `hailo_apps\u002Fpython\u002Fstandalone_apps\u002Fobject_detection\u002F` — the canonical standalone app:\n- `object_detection.py` — 3-thread architecture, HailoInfer, queue-based\n- Also see: `pose_estimation\u002F`, `instance_segmentation\u002F`, `lane_detection\u002F`\n\n## Build Process\n\n### Step 1: Create App Directory\n\nCreate the app directory:\n\n```\nhailo_apps\u002Fpython\u002F\u003Ctype>\u002F\u003Capp_name>\u002F\n├── app.yaml              # App manifest (type: standalone)\n├── run.sh                # Launch wrapper\n├── __init__.py\n├── \u003Capp_name>.py         # Main app (3-thread architecture)\n├── \u003Capp_name>_post_process.py  # Custom postprocessing\n├── config.json           # Labels, thresholds (optional)\n└── README.md             # Usage documentation (REQUIRED — never skip)\n```\n\nCreate `app.yaml` with `type: standalone` and `run.sh` wrapper.\nDo NOT register in `defines.py` or `resources_config.yaml`.\n\n### Step 2: Build Main App (3-Thread Architecture)\n\n```python\nimport threading\nimport queue\nimport signal\nimport cv2\nimport numpy as np\n\nfrom hailo_apps.python.core.common.hailo_logger import get_logger\nfrom hailo_apps.python.core.common.core import resolve_hef_path, handle_and_resolve_args\nfrom hailo_apps.python.core.common.parser import get_standalone_parser\nfrom hailo_apps.python.core.common.hailo_inference import HailoInfer\n\nlogger = get_logger(__name__)\n\nAPP_NAME = \"my_standalone_app\"\nMAX_INPUT_QUEUE_SIZE = 5\nMAX_OUTPUT_QUEUE_SIZE = 5\nMAX_ASYNC_INFER_JOBS = 3\n\n\ndef preprocess_thread(cap, input_queue, hailo_infer, stop_event):\n    height, width, _ = hailo_infer.get_input_shape()\n    while not stop_event.is_set():\n        ret, frame = cap.read()\n        if not ret:\n            break\n        resized = cv2.resize(frame, (width, height))\n        input_queue.put((frame, resized))\n    input_queue.put(None)\n\n\ndef infer_thread(hailo_infer, input_queue, output_queue, stop_event):\n    while not stop_event.is_set():\n        item = input_queue.get()\n        if item is None:\n            break\n        frame, preprocessed = item\n        results = hailo_infer.run(preprocessed)\n        output_queue.put((frame, results))\n    output_queue.put(None)\n\n\ndef postprocess_thread(output_queue, stop_event, no_display):\n    while not stop_event.is_set():\n        item = output_queue.get()\n        if item is None:\n            break\n        frame, results = item\n        # Custom postprocessing here\n        if not no_display:\n            cv2.imshow(\"Output\", frame)\n            if cv2.waitKey(1) & 0xFF == ord('q'):\n                stop_event.set()\n\n\ndef main():\n    parser = get_standalone_parser()\n    args = parser.parse_args()\n    args = handle_and_resolve_args(args, APP_NAME)\n\n    stop_event = threading.Event()\n    signal.signal(signal.SIGINT, lambda s, f: stop_event.set())\n\n    hailo_infer = HailoInfer(str(args.hef_path), args.batch_size)\n    cap = cv2.VideoCapture(args.input)\n\n    input_q = queue.Queue(maxsize=MAX_INPUT_QUEUE_SIZE)\n    output_q = queue.Queue(maxsize=MAX_OUTPUT_QUEUE_SIZE)\n\n    threads = [\n        threading.Thread(target=preprocess_thread, args=(cap, input_q, hailo_infer, stop_event)),\n        threading.Thread(target=infer_thread, args=(hailo_infer, input_q, output_q, stop_event)),\n        threading.Thread(target=postprocess_thread, args=(output_q, stop_event, args.no_display)),\n    ]\n\n    try:\n        for t in threads:\n            t.start()\n        for t in threads:\n            t.join()\n    finally:\n        hailo_infer.close()\n        cap.release()\n        cv2.destroyAllWindows()\n\n\nif __name__ == \"__main__\":\n    main()\n```\n\n### Step 4: Validate\n\n```bash\npython3 .github\u002Fscripts\u002Fvalidate_app.py hailo_apps\u002Fpython\u002Fstandalone_apps\u002Fmy_standalone_app --smoke-test\n```\n\n## Critical Conventions\n\n1. **CLI parser**: `get_standalone_parser()` — includes `--input`, `--hef-path`, `--batch-size`, `--no-display`, `--save-output`\n2. **HEF resolution**: `handle_and_resolve_args(args, APP_NAME)`\n3. **3-thread pattern**: preprocess → infer → postprocess, connected by `queue.Queue`\n4. **Queue sentinel**: `queue.put(None)` to signal thread termination\n5. **Async inference**: Limit concurrent jobs with `MAX_ASYNC_INFER_JOBS`\n6. **Cleanup**: Always `hailo_infer.close()` in finally block\n7. **Stop event**: `threading.Event()` for graceful shutdown\n8. **Signal handler**: Register SIGINT to set stop_event\n\n",{"name":5,"description":7},"main","9beb824677028b4974e90b0cc558b6fd6de3d935",".github\u002Fskills\u002Fhl-build-standalone-app","https:\u002F\u002Fgithub.com\u002FTejasLamba2006\u002Fhailo-apps","https:\u002F\u002Fgithub.com\u002FTejasLamba2006","https:\u002F\u002Ftejas.is-a.dev\u002F","Rust | Java |  TypeScript ","2026-11-12 16:44:30",{"source":8,"skillName":5,"commands":33,"prompt":43,"zipAvailable":44},[34,37,40],{"tool":35,"command":36},"npx","npx skills add TejasLamba2006\u002Fhailo-apps --skill hl-build-standalone-app",{"tool":38,"command":39},"bunx","bunx skills add TejasLamba2006\u002Fhailo-apps --skill hl-build-standalone-app",{"tool":41,"command":42},"pnpm","pnpm dlx skills add TejasLamba2006\u002Fhailo-apps --skill hl-build-standalone-app","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FTejasLamba2006\u002Fhailo-apps\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fhl-build-standalone-app\u002FSKILL.md",true,[],[47,53,60,67,74,81],{"skillNo":48,"name":49,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":50,"categories":51,"keywords":52,"publishedAt":19},"01M752Y17N6R7ME2TRA2NNS5X3","hl-build-voice-app","https:\u002F\u002Fgithub.com\u002FTejasLamba2006\u002Fhailo-apps\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fhl-build-voice-app\u002FSKILL.md",[],[],{"skillNo":54,"name":55,"nameZh":6,"description":56,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":57,"categories":58,"keywords":59,"publishedAt":19},"01M752XW3BPNVCM0823YAEP6YA","hl-build-vlm-app","Build a complete Vision-Language Model application that uses the Hailo-10H VLM for image understanding.","https:\u002F\u002Fgithub.com\u002FTejasLamba2006\u002Fhailo-apps\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fhl-build-vlm-app\u002FSKILL.md",[],[],{"skillNo":61,"name":62,"nameZh":6,"description":63,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":64,"categories":65,"keywords":66,"publishedAt":19},"01M752XNJFF5KT07AZAZ6N07BP","hl-build-pipeline-app","Build a complete GStreamer pipeline app for real-time video processing on Hailo-8\u002F8L\u002F10H.","https:\u002F\u002Fgithub.com\u002FTejasLamba2006\u002Fhailo-apps\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fhl-build-pipeline-app\u002FSKILL.md",[],[],{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":73,"publishedAt":19},"01M752XK1JS2XC5BF31EVA06XP","hl-build-llm-app","Build a complete LLM text generation app running on Hailo-10H.","https:\u002F\u002Fgithub.com\u002FTejasLamba2006\u002Fhailo-apps\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fhl-build-llm-app\u002FSKILL.md",[],[],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":80,"publishedAt":19},"01M752XFTEGGYMFEWZVECY31HM","hl-build-agent-app","Build a complete agent app with LLM reasoning + tool execution on Hailo-10H.","https:\u002F\u002Fgithub.com\u002FTejasLamba2006\u002Fhailo-apps\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fhl-build-agent-app\u002FSKILL.md",[],[],{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":19},"01M752XBWXEB5MRRHGAQBK6JHC","hl-validate","Validation at every phase gate.","https:\u002F\u002Fgithub.com\u002FTejasLamba2006\u002Fhailo-apps\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fhl-validate\u002FSKILL.md",[],[]]