From 5792df7b7057abff07263a24f1ef7d4bf915de3b Mon Sep 17 00:00:00 2001 From: Billy Wang Date: Tue, 23 Sep 2025 22:26:46 +0800 Subject: [PATCH] generate_image_links.py --- generate_image_links.py | 132 ++++++++++++++ image_links.md | 390 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 522 insertions(+) create mode 100644 generate_image_links.py create mode 100644 image_links.md diff --git a/generate_image_links.py b/generate_image_links.py new file mode 100644 index 0000000..8de20b7 --- /dev/null +++ b/generate_image_links.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python3 +""" +Script to generate markdown file with WebP image links from source images. +This script scans the src/images directory and creates markdown links for all images +that would be converted to WebP format during the build process. +""" + +import os +import sys +from pathlib import Path + +def find_image_files(directory): + """Find all image files that would be converted to WebP.""" + image_extensions = {'.png', '.jpg', '.jpeg'} + svg_extensions = {'.svg'} + image_files = [] + svg_files = [] + + for root, dirs, files in os.walk(directory): + for file in files: + file_path = Path(root) / file + if file_path.suffix.lower() in image_extensions: + # Get relative path from src/images + rel_path = file_path.relative_to(directory) + image_files.append(rel_path) + elif file_path.suffix.lower() in svg_extensions: + # Get relative path from src/images + rel_path = file_path.relative_to(directory) + svg_files.append(rel_path) + + return sorted(image_files), sorted(svg_files) + +def generate_markdown_links(image_files, base_url="https://assets.openterface.com"): + """Generate markdown links for WebP images.""" + markdown_lines = [] + + for image_path in image_files: + # Convert to WebP extension + webp_path = image_path.with_suffix('.webp') + + # Create the full URL + full_url = f"{base_url}/images/{webp_path}" + + # Create a descriptive name for the alt text + # Remove path separators and file extension, replace with hyphens + alt_name = str(webp_path).replace('/', '-').replace('\\', '-').replace('.webp', '') + + # Generate markdown link + markdown_link = f"![{alt_name}]({full_url})" + markdown_lines.append(markdown_link) + + return markdown_lines + +def generate_svg_markdown_links(svg_files, base_url="https://assets.openterface.com"): + """Generate markdown links for SVG images.""" + markdown_lines = [] + + for svg_path in svg_files: + # Create the full URL (keep .svg extension) + full_url = f"{base_url}/images/{svg_path}" + + # Create a descriptive name for the alt text + # Remove path separators and file extension, replace with hyphens + alt_name = str(svg_path).replace('/', '-').replace('\\', '-').replace('.svg', '') + + # Generate markdown link + markdown_link = f"![{alt_name}]({full_url})" + markdown_lines.append(markdown_link) + + return markdown_lines + +def main(): + # Get the script directory + script_dir = Path(__file__).parent + src_images_dir = script_dir / "src" / "images" + + # Check if src/images directory exists + if not src_images_dir.exists(): + print(f"Error: {src_images_dir} directory not found!") + print("Please run this script from the project root directory.") + sys.exit(1) + + print(f"Scanning for images in: {src_images_dir}") + + # Find all image files + image_files, svg_files = find_image_files(src_images_dir) + + if not image_files and not svg_files: + print("No image files found!") + return + + print(f"Found {len(image_files)} image files and {len(svg_files)} SVG files") + + # Generate markdown links + webp_markdown_lines = generate_markdown_links(image_files) + svg_markdown_lines = generate_svg_markdown_links(svg_files) + + # Write to output file + output_file = script_dir / "image_links.md" + + with open(output_file, 'w', encoding='utf-8') as f: + f.write("# Image Links\n\n") + f.write("Generated from source images in src/images/\n\n") + + if webp_markdown_lines: + f.write("## WebP Image Links\n\n") + f.write("Copy and paste these links into your markdown files:\n\n") + for line in webp_markdown_lines: + f.write(line + "\n\n") + + if svg_markdown_lines: + f.write("## SVG Image Links\n\n") + f.write("Copy and paste these links into your markdown files:\n\n") + for line in svg_markdown_lines: + f.write(line + "\n\n") + + print(f"Generated {len(webp_markdown_lines)} WebP image links and {len(svg_markdown_lines)} SVG links") + print(f"Output saved to: {output_file}") + + # Also print a few examples + if webp_markdown_lines: + print("\nFirst 3 WebP links:") + for i, line in enumerate(webp_markdown_lines[:3]): + print(f"{i+1}. {line}") + + if svg_markdown_lines: + print("\nFirst 3 SVG links:") + for i, line in enumerate(svg_markdown_lines[:3]): + print(f"{i+1}. {line}") + +if __name__ == "__main__": + main() diff --git a/image_links.md b/image_links.md new file mode 100644 index 0000000..4ced5f9 --- /dev/null +++ b/image_links.md @@ -0,0 +1,390 @@ +# Image Links + +Generated from source images in src/images/ + +## WebP Image Links + +Copy and paste these links into your markdown files: + +![android-colorSetting](https://assets.openterface.com/images/android/colorSetting.webp) + +![android-enlargeAndKeyBoard](https://assets.openterface.com/images/android/enlargeAndKeyBoard.webp) + +![android-enlargeAndSideBar](https://assets.openterface.com/images/android/enlargeAndSideBar.webp) + +![android-enlargeDisplay](https://assets.openterface.com/images/android/enlargeDisplay.webp) + +![android-keyBoardFunction](https://assets.openterface.com/images/android/keyBoardFunction.webp) + +![android-keyBoardSystem](https://assets.openterface.com/images/android/keyBoardSystem.webp) + +![android-keyBoardView](https://assets.openterface.com/images/android/keyBoardView.webp) + +![android-mousePointerMode](https://assets.openterface.com/images/android/mousePointerMode.webp) + +![android-mouseThouchMode](https://assets.openterface.com/images/android/mouseThouchMode.webp) + +![android-sidebarDisplay](https://assets.openterface.com/images/android/sidebarDisplay.webp) + +![android-videoConnect](https://assets.openterface.com/images/android/videoConnect.webp) + +![appstore-GetItOnGooglePlay_Badge_Web_color_English](https://assets.openterface.com/images/appstore/GetItOnGooglePlay_Badge_Web_color_English.webp) + +![blog-Casey-Setup-with-Pi-and-minikvm](https://assets.openterface.com/images/blog/Casey-Setup-with-Pi-and-minikvm.webp) + +![blog-Casey-iPad-KVM-chat](https://assets.openterface.com/images/blog/Casey-iPad-KVM-chat.webp) + +![blog-Kashall-app-in-action](https://assets.openterface.com/images/blog/Kashall-app-in-action.webp) + +![blog-Kashall-app-ui](https://assets.openterface.com/images/blog/Kashall-app-ui.webp) + +![blog-Veera-audio-bridge-chat-with-veera](https://assets.openterface.com/images/blog/Veera-audio-bridge-chat-with-veera.webp) + +![cover-Gibby-with-Christmas-hat](https://assets.openterface.com/images/cover-Gibby-with-Christmas-hat.webp) + +![favicon](https://assets.openterface.com/images/favicon.webp) + +![guide-macos-dmg-installation1](https://assets.openterface.com/images/guide/macos-dmg-installation1.webp) + +![guide-macos-dmg-installation2](https://assets.openterface.com/images/guide/macos-dmg-installation2.webp) + +![guide-macos-dmg-installation3-not-opened](https://assets.openterface.com/images/guide/macos-dmg-installation3-not-opened.webp) + +![guide-macos-dmg-installation4-privacysecurity](https://assets.openterface.com/images/guide/macos-dmg-installation4-privacysecurity.webp) + +![guide-macos-dmg-installation5-password](https://assets.openterface.com/images/guide/macos-dmg-installation5-password.webp) + +![guide-macos-dmg-installation6-opened](https://assets.openterface.com/images/guide/macos-dmg-installation6-opened.webp) + +![kvm-go-hdmi-p1](https://assets.openterface.com/images/kvm-go/hdmi-p1.webp) + +![kvm-go-hdmi-p2](https://assets.openterface.com/images/kvm-go/hdmi-p2.webp) + +![kvm-go-hdmi-p3](https://assets.openterface.com/images/kvm-go/hdmi-p3.webp) + +![kvm-go-hdmi-p4](https://assets.openterface.com/images/kvm-go/hdmi-p4.webp) + +![kvm-go-hdmi-p5](https://assets.openterface.com/images/kvm-go/hdmi-p5.webp) + +![kvm-go-hdmi-p6](https://assets.openterface.com/images/kvm-go/hdmi-p6.webp) + +![kvm-go-hdmi-p7](https://assets.openterface.com/images/kvm-go/hdmi-p7.webp) + +![kvm-go-hdmi-p8](https://assets.openterface.com/images/kvm-go/hdmi-p8.webp) + +![kvm-go-kvm-go-group-3](https://assets.openterface.com/images/kvm-go/kvm-go-group-3.webp) + +![kvm-go-kvm-go-hdmi-early-test-2](https://assets.openterface.com/images/kvm-go/kvm-go-hdmi-early-test-2.webp) + +![kvm-go-kvm-go-product-page-subscribe](https://assets.openterface.com/images/kvm-go/kvm-go-product-page-subscribe.webp) + +![labels-host-side](https://assets.openterface.com/images/labels/host-side.webp) + +![labels-target-side](https://assets.openterface.com/images/labels/target-side.webp) + +![op-avatar](https://assets.openterface.com/images/op-avatar.webp) + +![openterface](https://assets.openterface.com/images/openterface.webp) + +![product-android_plus_pen](https://assets.openterface.com/images/product/android_plus_pen.webp) + +![product-basic-two-angled](https://assets.openterface.com/images/product/basic-two-angled.webp) + +![product-basic-two-sides-angled](https://assets.openterface.com/images/product/basic-two-sides-angled.webp) + +![product-basic-with-maunal](https://assets.openterface.com/images/product/basic-with-maunal.webp) + +![product-close-up](https://assets.openterface.com/images/product/close-up.webp) + +![product-mini-kvm-pins-port](https://assets.openterface.com/images/product/mini-kvm-pins-port.webp) + +![product-openterface-kvm-uconsole-extension-back](https://assets.openterface.com/images/product/openterface-kvm-uconsole-extension-back.webp) + +![product-openterface-kvm-uconsole-extension-gasket-1](https://assets.openterface.com/images/product/openterface-kvm-uconsole-extension-gasket-1.webp) + +![product-openterface-kvm-uconsole-extension-install-1](https://assets.openterface.com/images/product/openterface-kvm-uconsole-extension-install-1.webp) + +![product-openterface-kvm-uconsole-extension-install-2](https://assets.openterface.com/images/product/openterface-kvm-uconsole-extension-install-2.webp) + +![product-openterface-kvm-uconsole-extension-use-case-1a](https://assets.openterface.com/images/product/openterface-kvm-uconsole-extension-use-case-1a.webp) + +![product-openterface-kvm-uconsole-extension-use-case-1b](https://assets.openterface.com/images/product/openterface-kvm-uconsole-extension-use-case-1b.webp) + +![product-openterface-kvm-uconsole-extension-use-case-1c](https://assets.openterface.com/images/product/openterface-kvm-uconsole-extension-use-case-1c.webp) + +![product-openterface-kvm-uconsole-extension-use-case-2](https://assets.openterface.com/images/product/openterface-kvm-uconsole-extension-use-case-2.webp) + +![product-openterface-kvm-uconsole-extension](https://assets.openterface.com/images/product/openterface-kvm-uconsole-extension.webp) + +![product-openterface-mini-kvm-product-with-PCB](https://assets.openterface.com/images/product/openterface-mini-kvm-product-with-PCB.webp) + +![product-part-CABLE100-VGA2HDMI-1](https://assets.openterface.com/images/product/part/CABLE100-VGA2HDMI-1.webp) + +![product-part-CABLE100-VGA2HDMI-2](https://assets.openterface.com/images/product/part/CABLE100-VGA2HDMI-2.webp) + +![product-part-OP-01-MINIKVM](https://assets.openterface.com/images/product/part/OP-01-MINIKVM.webp) + +![product-part-OP-02-QUICK-GUIDE](https://assets.openterface.com/images/product/part/OP-02-QUICK-GUIDE.webp) + +![product-part-OP-03-CABLE30-HDMI](https://assets.openterface.com/images/product/part/OP-03-CABLE30-HDMI.webp) + +![product-part-OP-04-CABLE30-C2A](https://assets.openterface.com/images/product/part/OP-04-CABLE30-C2A.webp) + +![product-part-OP-05-CABLE150-C2C](https://assets.openterface.com/images/product/part/OP-05-CABLE150-C2C.webp) + +![product-part-OP-06-BAG-TOOLKIT](https://assets.openterface.com/images/product/part/OP-06-BAG-TOOLKIT.webp) + +![product-part-OP-MINIKVM-BASIC](https://assets.openterface.com/images/product/part/OP-MINIKVM-BASIC.webp) + +![product-part-OP-MINIKVM-TOOLKIT](https://assets.openterface.com/images/product/part/OP-MINIKVM-TOOLKIT.webp) + +![product-part-mini-kvm-scale-v1-9](https://assets.openterface.com/images/product/part/mini-kvm-scale-v1-9.webp) + +![product-part-nylon-usb-c-cable](https://assets.openterface.com/images/product/part/nylon-usb-c-cable.webp) + +![product-part-pin-cap](https://assets.openterface.com/images/product/part/pin-cap.webp) + +![product-product-option-1-basic](https://assets.openterface.com/images/product/product-option-1-basic.webp) + +![product-product-option-2-toolkit](https://assets.openterface.com/images/product/product-option-2-toolkit.webp) + +![product-switch-graphics](https://assets.openterface.com/images/product/switch-graphics.webp) + +![product-toolkit-open-2024](https://assets.openterface.com/images/product/toolkit-open-2024.webp) + +![product-toolkit-open](https://assets.openterface.com/images/product/toolkit-open.webp) + +![product-toolkit-parts-layout-2-numbers-2024](https://assets.openterface.com/images/product/toolkit-parts-layout-2-numbers-2024.webp) + +![product-toolkit-parts-layout-numbers](https://assets.openterface.com/images/product/toolkit-parts-layout-numbers.webp) + +![product-toolkit-parts](https://assets.openterface.com/images/product/toolkit-parts.webp) + +![product-use-case-demo-industrial-pc](https://assets.openterface.com/images/product/use-case-demo-industrial-pc.webp) + +![product-use-case-demo-macbookpro2010](https://assets.openterface.com/images/product/use-case-demo-macbookpro2010.webp) + +![product-use-case-demo-macmini2009-3](https://assets.openterface.com/images/product/use-case-demo-macmini2009-3.webp) + +![product-use-case-demo-pc-bios-1](https://assets.openterface.com/images/product/use-case-demo-pc-bios-1.webp) + +![product-use-case-demo-pc-bios-2](https://assets.openterface.com/images/product/use-case-demo-pc-bios-2.webp) + +![product-use-case-demo-pc](https://assets.openterface.com/images/product/use-case-demo-pc.webp) + +![product-use-case-demo-respberry-pi](https://assets.openterface.com/images/product/use-case-demo-respberry-pi.webp) + +![product-use-case-pc-angled-view](https://assets.openterface.com/images/product/use-case-pc-angled-view.webp) + +![product-win_qt_app](https://assets.openterface.com/images/product/win_qt_app.webp) + +![product-win_qt_app_os](https://assets.openterface.com/images/product/win_qt_app_os.webp) + +![qt-advanceScriptTool](https://assets.openterface.com/images/qt/advanceScriptTool.webp) + +![qt-advanceSerialConsole](https://assets.openterface.com/images/qt/advanceSerialConsole.webp) + +![qt-mainwindow](https://assets.openterface.com/images/qt/mainwindow.webp) + +![qt-menuAdvance](https://assets.openterface.com/images/qt/menuAdvance.webp) + +![qt-menuHelp](https://assets.openterface.com/images/qt/menuHelp.webp) + +![qt-menubar](https://assets.openterface.com/images/qt/menubar.webp) + +![qt-preferenceGernal](https://assets.openterface.com/images/qt/preferenceGernal.webp) + +![qt-preferenceTargetControl](https://assets.openterface.com/images/qt/preferenceTargetControl.webp) + +![qt-preferenceVideo](https://assets.openterface.com/images/qt/preferenceVideo.webp) + +![txa-avatar](https://assets.openterface.com/images/txa-avatar.webp) + +## SVG Image Links + +Copy and paste these links into your markdown files: + +![appstore-Download_on_the_Mac_App_Store](https://assets.openterface.com/images/appstore/Download_on_the_Mac_App_Store.svg) + +![appstore-Download_on_the_Mac_App_Store_Badge_US-UK_RGB_wht_092917](https://assets.openterface.com/images/appstore/Download_on_the_Mac_App_Store_Badge_US-UK_RGB_wht_092917.svg) + +![appstore-Flathub-badge-en-2023](https://assets.openterface.com/images/appstore/Flathub-badge-en-2023.svg) + +![appstore-GetItOn_Flathub](https://assets.openterface.com/images/appstore/GetItOn_Flathub.svg) + +![appstore-Get_it_from_Microsoft](https://assets.openterface.com/images/appstore/Get_it_from_Microsoft.svg) + +![appstore-Google_Play_Store](https://assets.openterface.com/images/appstore/Google_Play_Store.svg) + +![feature-icons-icon-bios-access-d](https://assets.openterface.com/images/feature-icons/icon-bios-access-d.svg) + +![feature-icons-icon-bios-access](https://assets.openterface.com/images/feature-icons/icon-bios-access.svg) + +![feature-icons-icon-more-d](https://assets.openterface.com/images/feature-icons/icon-more-d.svg) + +![feature-icons-icon-more](https://assets.openterface.com/images/feature-icons/icon-more.svg) + +![feature-icons-icon-network-free-d](https://assets.openterface.com/images/feature-icons/icon-network-free-d.svg) + +![feature-icons-icon-network-free](https://assets.openterface.com/images/feature-icons/icon-network-free.svg) + +![feature-icons-icon-plug-and-play-d](https://assets.openterface.com/images/feature-icons/icon-plug-and-play-d.svg) + +![feature-icons-icon-plug-and-play](https://assets.openterface.com/images/feature-icons/icon-plug-and-play.svg) + +![feature-icons-icon-text-transfer-d](https://assets.openterface.com/images/feature-icons/icon-text-transfer-d.svg) + +![feature-icons-icon-text-transfer](https://assets.openterface.com/images/feature-icons/icon-text-transfer.svg) + +![feature-icons-icon-usb-switch-d](https://assets.openterface.com/images/feature-icons/icon-usb-switch-d.svg) + +![feature-icons-icon-usb-switch](https://assets.openterface.com/images/feature-icons/icon-usb-switch.svg) + +![logo_txa_b](https://assets.openterface.com/images/logo_txa_b.svg) + +![logo_txa_w](https://assets.openterface.com/images/logo_txa_w.svg) + +![openterface-minikvm](https://assets.openterface.com/images/openterface-minikvm.svg) + +![openterface](https://assets.openterface.com/images/openterface.svg) + +![openterface_w](https://assets.openterface.com/images/openterface_w.svg) + +![product-change-cap](https://assets.openterface.com/images/product/change-cap.svg) + +![product-change-cap_1](https://assets.openterface.com/images/product/change-cap_1.svg) + +![product-extension-pins-1](https://assets.openterface.com/images/product/extension-pins-1.svg) + +![product-extension-pins-1_1](https://assets.openterface.com/images/product/extension-pins-1_1.svg) + +![product-extension-pins-2](https://assets.openterface.com/images/product/extension-pins-2.svg) + +![product-extension-pins-2_1](https://assets.openterface.com/images/product/extension-pins-2_1.svg) + +![product-host-htc](https://assets.openterface.com/images/product/host-htc.svg) + +![product-host-htc_1](https://assets.openterface.com/images/product/host-htc_1.svg) + +![product-mini-kvm-front-htc](https://assets.openterface.com/images/product/mini-kvm-front-htc.svg) + +![product-mini-kvm-front-htc_1](https://assets.openterface.com/images/product/mini-kvm-front-htc_1.svg) + +![product-minikvm-v1-9-back](https://assets.openterface.com/images/product/minikvm-v1-9-back.svg) + +![product-minikvm-v1-9-back_1](https://assets.openterface.com/images/product/minikvm-v1-9-back_1.svg) + +![product-minikvm-v1-9-front](https://assets.openterface.com/images/product/minikvm-v1-9-front.svg) + +![product-minikvm-v1-9-front_1](https://assets.openterface.com/images/product/minikvm-v1-9-front_1.svg) + +![product-minikvm-v1-9-host](https://assets.openterface.com/images/product/minikvm-v1-9-host.svg) + +![product-minikvm-v1-9-host_1](https://assets.openterface.com/images/product/minikvm-v1-9-host_1.svg) + +![product-minikvm-v1-9-target](https://assets.openterface.com/images/product/minikvm-v1-9-target.svg) + +![product-minikvm-v1-9-target_1](https://assets.openterface.com/images/product/minikvm-v1-9-target_1.svg) + +![product-switch-graphics](https://assets.openterface.com/images/product/switch-graphics.svg) + +![product-switch-graphics_1](https://assets.openterface.com/images/product/switch-graphics_1.svg) + +![product-target-htc](https://assets.openterface.com/images/product/target-htc.svg) + +![product-target-htc_1](https://assets.openterface.com/images/product/target-htc_1.svg) + +![product-to-host](https://assets.openterface.com/images/product/to-host.svg) + +![product-to-host_1](https://assets.openterface.com/images/product/to-host_1.svg) + +![product-to-target](https://assets.openterface.com/images/product/to-target.svg) + +![product-to-target_1](https://assets.openterface.com/images/product/to-target_1.svg) + +![shell-icons-ce](https://assets.openterface.com/images/shell-icons/ce.svg) + +![shell-icons-host-computer](https://assets.openterface.com/images/shell-icons/host-computer.svg) + +![shell-icons-host-computer_1](https://assets.openterface.com/images/shell-icons/host-computer_1.svg) + +![shell-icons-host](https://assets.openterface.com/images/shell-icons/host.svg) + +![shell-icons-host_1](https://assets.openterface.com/images/shell-icons/host_1.svg) + +![shell-icons-input](https://assets.openterface.com/images/shell-icons/input.svg) + +![shell-icons-input_1](https://assets.openterface.com/images/shell-icons/input_1.svg) + +![shell-icons-keyboard-mouse](https://assets.openterface.com/images/shell-icons/keyboard-mouse.svg) + +![shell-icons-osh](https://assets.openterface.com/images/shell-icons/osh.svg) + +![shell-icons-oshw](https://assets.openterface.com/images/shell-icons/oshw.svg) + +![shell-icons-osi](https://assets.openterface.com/images/shell-icons/osi.svg) + +![shell-icons-pins](https://assets.openterface.com/images/shell-icons/pins.svg) + +![shell-icons-pins_1](https://assets.openterface.com/images/shell-icons/pins_1.svg) + +![shell-icons-screen](https://assets.openterface.com/images/shell-icons/screen.svg) + +![shell-icons-switchable-usb](https://assets.openterface.com/images/shell-icons/switchable-usb.svg) + +![shell-icons-switchable-usb_1](https://assets.openterface.com/images/shell-icons/switchable-usb_1.svg) + +![shell-icons-switchable](https://assets.openterface.com/images/shell-icons/switchable.svg) + +![shell-icons-target-computer](https://assets.openterface.com/images/shell-icons/target-computer.svg) + +![shell-icons-target-computer_1](https://assets.openterface.com/images/shell-icons/target-computer_1.svg) + +![shell-icons-target](https://assets.openterface.com/images/shell-icons/target.svg) + +![shell-icons-target_1](https://assets.openterface.com/images/shell-icons/target_1.svg) + +![shell-icons-toggle-h-t](https://assets.openterface.com/images/shell-icons/toggle-h-t.svg) + +![shell-icons-toggle-h-t_1](https://assets.openterface.com/images/shell-icons/toggle-h-t_1.svg) + +![shell-icons-toggle](https://assets.openterface.com/images/shell-icons/toggle.svg) + +![shell-icons-toggle_1](https://assets.openterface.com/images/shell-icons/toggle_1.svg) + +![shell-icons-ukca](https://assets.openterface.com/images/shell-icons/ukca.svg) + +![shell-icons-weee](https://assets.openterface.com/images/shell-icons/weee.svg) + +![trademark-android](https://assets.openterface.com/images/trademark/android.svg) + +![trademark-app-store](https://assets.openterface.com/images/trademark/app-store.svg) + +![trademark-apple](https://assets.openterface.com/images/trademark/apple.svg) + +![trademark-ce](https://assets.openterface.com/images/trademark/ce.svg) + +![trademark-crowd-supply](https://assets.openterface.com/images/trademark/crowd-supply.svg) + +![trademark-linux](https://assets.openterface.com/images/trademark/linux.svg) + +![trademark-open-source-hardware](https://assets.openterface.com/images/trademark/open-source-hardware.svg) + +![trademark-open-source-initiative](https://assets.openterface.com/images/trademark/open-source-initiative.svg) + +![trademark-oshw-cn000015](https://assets.openterface.com/images/trademark/oshw-cn000015.svg) + +![trademark-rohs](https://assets.openterface.com/images/trademark/rohs.svg) + +![trademark-txa](https://assets.openterface.com/images/trademark/txa.svg) + +![trademark-ukca](https://assets.openterface.com/images/trademark/ukca.svg) + +![trademark-weee](https://assets.openterface.com/images/trademark/weee.svg) + +![trademark-win](https://assets.openterface.com/images/trademark/win.svg) + +![usbkvm-usb-kvm-connect-dark](https://assets.openterface.com/images/usbkvm/usb-kvm-connect-dark.svg) + +![usbkvm-usb-kvm-connect-light](https://assets.openterface.com/images/usbkvm/usb-kvm-connect-light.svg) +