{"id":48525311,"url":"https://github.com/hevnsnt/artinchip-linux","last_synced_at":"2026-04-07T22:04:13.718Z","repository":{"id":348598072,"uuid":"1198877407","full_name":"hevnsnt/artinchip-linux","owner":"hevnsnt","description":"Linux driver for ArtInChip USB bar monitors (ZHAOCAILIN 11.3\" 1920x440). Reverse-engineered RSA auth + JPEG frame streaming. Supports websites, YouTube, video files.","archived":false,"fork":false,"pushed_at":"2026-04-02T02:15:21.000Z","size":549,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-02T09:10:11.813Z","etag":null,"topics":["1920x440","artinchip","bar-monitor","display-driver","linux-driver","python","reverse-engineering","usb","usb-display","zhaocailin"],"latest_commit_sha":null,"homepage":"https://github.com/hevnsnt/artinchip-linux","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hevnsnt.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":"2026-04-01T21:04:48.000Z","updated_at":"2026-04-02T02:15:25.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/hevnsnt/artinchip-linux","commit_stats":null,"previous_names":["hevnsnt/artinchip-linux"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/hevnsnt/artinchip-linux","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hevnsnt%2Fartinchip-linux","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hevnsnt%2Fartinchip-linux/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hevnsnt%2Fartinchip-linux/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hevnsnt%2Fartinchip-linux/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hevnsnt","download_url":"https://codeload.github.com/hevnsnt/artinchip-linux/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hevnsnt%2Fartinchip-linux/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31530649,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T16:28:08.000Z","status":"ssl_error","status_checked_at":"2026-04-07T16:28:06.951Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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":["1920x440","artinchip","bar-monitor","display-driver","linux-driver","python","reverse-engineering","usb","usb-display","zhaocailin"],"created_at":"2026-04-07T22:04:07.800Z","updated_at":"2026-04-07T22:04:13.707Z","avatar_url":"https://github.com/hevnsnt.png","language":"Python","readme":"# tinyscreen — Linux Display Engine for ArtInChip USB Bar Monitors\n\n**Turn cheap ArtInChip (33c3:0e02) USB-C bar displays into dashboard screens, virtual monitors, or media players on Linux.** Built for the popular ZHAOCAILIN 11.3\" 1920x440 stretched LCDs sold on AliExpress.\n\n10+ built-in dashboards, EVDI virtual display support, low-CPU website rendering, and video playback. These monitors ship with Windows-only drivers and have **zero Linux support** — until now.\n\n![License](https://img.shields.io/badge/license-MIT-blue)\n![Python](https://img.shields.io/badge/python-3.10+-green)\n![Platform](https://img.shields.io/badge/platform-Linux-orange)\n\n## Screenshots\n\n**System Monitor** — CPU cores, temps, GPU, memory, disk, swap, network:\n![sysmon](screenshots/sysmon.png)\n\n**Crypto Ticker** — live prices from CoinGecko with 24h change:\n![ticker](screenshots/ticker.png)\n\n**Clock + Weather** — animated weather scenes, 12hr time, system stats:\n![clock](screenshots/clock.png)\n\n**Docker Monitor** — container status, CPU/memory bars, network I/O:\n![docker](screenshots/docker_mon.png)\n\n**Network Monitor** — active connections, state breakdown, process names:\n![netmon](screenshots/netmon.png)\n\n**Matrix Rain** — digital rain effect with live syslog data:\n![matrix](screenshots/matrix.png)\n\n**Pomodoro Timer** — 25/5 focus timer with circular progress:\n![pomodoro](screenshots/pomodoro.png)\n\n**Network Map** — live device scanner with color-coded types:\n![lanmap](screenshots/lanmap.png)\n\n**DNS Blocker** — AdGuard/Pi-hole stats with query timeline:\n![pihole](screenshots/pihole.png)\n\n**Speed Test** — internet speed with animated testing and arc gauges:\n![speedtest](screenshots/speedtest.png)\n\n## Supported Hardware\n\n| Display | Resolution | Chipset | USB ID | Status |\n|---------|-----------|---------|--------|--------|\n| ZHAOCAILIN 11.3\" Bar LCD | 1920x440 | ArtInChip RISC-V | `33c3:0e02` | Fully working |\n| ArtInChip USB Display (0e01) | Various | ArtInChip | `33c3:0e01` | Should work (untested) |\n| ArtInChip USB Display (0e04) | Various | ArtInChip | `33c3:0e04` | Should work (untested) |\n| ArtInChip USB Display (0e05) | Various | ArtInChip | `33c3:0e05` | Should work (untested) |\n\nIf your `lsusb` shows **`33c3:0e0x`** and you're stuck on Linux, this is for you.\n\n## Quick Install\n\n```bash\ngit clone https://github.com/hevnsnt/artinchip-linux.git\ncd artinchip-linux\nsudo ./install.sh\n```\n\nThe installer handles dependencies, udev rules, and puts `tinyscreen` in your PATH. No sudo required after install.\n\n## Display Modes\n\n### Built-in Dashboards\n\n| Mode | Flag | Description |\n|------|------|-------------|\n| **System Monitor** | `--sysmon` | CPU per-core bars, temps, GPU, memory, disk, swap, network sparklines |\n| **Crypto Ticker** | `--ticker` | Live BTC/ETH/SOL/DOGE/ADA/DOT/LINK/AVAX prices with 24h change |\n| **Clock + Weather** | `--clock` | 12hr clock, animated weather scenes (fog, rain, sun, snow, storms), system stats |\n| **Matrix Rain** | `--matrix` | Digital rain effect with real syslog data overlay |\n| **Audio Visualizer** | `--visualizer` | FFT spectrum analyzer from PulseAudio/PipeWire capture |\n| **Now Playing** | `--nowplaying` | MPRIS media info (Spotify, etc.) with progress bar |\n| **Docker Monitor** | `--docker` | Container status, CPU/memory bars, network I/O |\n| **Network Monitor** | `--netmon` | Active connections, state breakdown, process names |\n| **News Crawl** | `--news` | Scrolling RSS headlines from Reuters, BBC, Hacker News |\n| **Pomodoro Timer** | `--pomodoro` | 25/5 focus timer with circular progress and color shifts |\n| **Network Map** | `--lanmap` | Live network device scanner via nmap with color-coded device types |\n| **DNS Blocker** | `--pihole` | AdGuard Home / Pi-hole stats with timeline and top blocked |\n| **Speed Test** | `--speedtest` | Internet speed test with animated particles and arc gauges |\n\n### Media \u0026 Web\n\n| Mode | Flag | Description |\n|------|------|-------------|\n| **Website** | `--url URL` | Low-CPU via EVDI virtual display + Chromium (auto-fallback to CDP) |\n| **Virtual Monitor** | `--monitor` | EVDI — tinyscreen becomes a real Linux display |\n| **YouTube** | `--video URL` | Fetches up to 4K source, scales to display |\n| **Local Video** | `--video FILE` | Any format ffmpeg supports, `--loop` to repeat |\n| **Static Image** | `--image FILE` | Display any image file |\n\n## Usage\n\n```bash\n# Single mode\ntinyscreen --sysmon\ntinyscreen --matrix\ntinyscreen --ticker\ntinyscreen --docker\ntinyscreen --clock\n\n# Display a website (low CPU via EVDI virtual display)\ntinyscreen --url https://your-dashboard.example.com/\ntinyscreen --url http://192.168.1.178:8420/\n\n# Use as a regular monitor (show anything from your desktop)\ntinyscreen --monitor\n\n# Rotate through modes (30 seconds each)\ntinyscreen --show all --delay 30\n\n# Rotate specific modes\ntinyscreen --show sysmon matrix ticker docker --delay 20\n\n# Play videos\ntinyscreen --video \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\"\ntinyscreen --video /path/to/video.mp4 --loop\n\n# Rotate the display output\ntinyscreen --sysmon --rotate 180\n\n# Just run — uses config.yml defaults\ntinyscreen\n\n# Screenshot current URL render\ntinyscreen --screenshot\ntinyscreen --screenshot /path/to/output.png\n\n# Control\ntinyscreen --status\ntinyscreen --off\n```\n\nAll commands run in the background by default. Add `--fg` to run in foreground.\n\n### All Options\n\n| Flag | Description |\n|------|-------------|\n| `--show MODE [MODE...]` | Rotate through modes (`all` for all, or list names) |\n| `--delay N` | Seconds per mode when rotating (default: 30) |\n| `--rotate N` | Rotate output 0/90/180/270 degrees |\n| `--fps N` | Target framerate (default: 24) |\n| `-q N` | JPEG quality 1-100 (default: auto) |\n| `--loop` | Loop video playback |\n| `--fg` | Run in foreground (don't daemonize) |\n| `--screenshot [FILE]` | Capture current URL render to PNG |\n| `--monitor` | EVDI virtual monitor — tinyscreen becomes a real display |\n| `--off` | Stop the running instance and blank the display |\n| `--status` | Show current status |\n| `--test` | Show test pattern |\n\n## Website Mode (--url)\n\nThe `--url` mode displays websites using **EVDI** (preferred) or CDP screencast (fallback):\n\n**EVDI mode (default when available, \u003c5% CPU):**\n1. Creates a **virtual monitor** via the EVDI kernel module\n2. Launches a real Chromium browser window on the virtual display\n3. The EVDI bridge captures pixels and streams them to USB\n4. CSS animations, JavaScript, and live dashboards all render at up to 30fps\n\n**CDP fallback (no EVDI, ~90% CPU):**\n1. Headless Chromium with Chrome DevTools Protocol screencast\n2. Works without EVDI but uses significantly more CPU\n\nEVDI is auto-detected. If available, `--url` uses it automatically. If not, it falls back to CDP with a log warning.\n\n## Virtual Monitor Mode (--monitor)\n\n`--monitor` makes the tinyscreen appear as a **real Linux display** in your desktop environment:\n\n```bash\ntinyscreen --monitor\n```\n\nAfter starting, the tinyscreen shows up in `xrandr` as `DVI-I-1-1` (or similar). You can drag windows onto it, extend your desktop, or use it as a dedicated status display. Pair it with any dashboard webpage, terminal, or application.\n\n### EVDI Setup (required for --monitor and low-CPU --url)\n\n```bash\n# Install EVDI\nsudo apt install evdi-dkms libevdi1\n\n# Load at boot\necho \"evdi\" | sudo tee /etc/modules-load.d/evdi.conf\necho \"options evdi initial_device_count=1\" | sudo tee /etc/modprobe.d/evdi.conf\n\n# Load now (or reboot)\nsudo modprobe evdi initial_device_count=1\n\n# IMPORTANT: Restart your display manager so X11 detects the EVDI card\nsudo systemctl restart lightdm   # or gdm3 for Ubuntu/GNOME\n```\n\n**Requirements:** X11 desktop session (XFCE, GNOME, KDE), `evdi-dkms`, `libevdi1`, `xdotool`.\n\n### Designing Pages for the Bar Display\n\nThe browser viewport is exactly **1920x440 pixels**. Key rules:\n- Everything must fit in 440px height — no scrolling\n- Use horizontal multi-column layouts (3-5 columns)\n- Large text: body 16-20px, headers 24-36px, key metrics 48-72px\n- Minimal padding (4-8px) — every pixel of height matters\n- No navbars, footers, or UI chrome\n\n## Configuration\n\nWhen you run `tinyscreen` with no arguments, it reads `/opt/tinyscreen/config.yml`:\n\n```yaml\n# What to run by default\nmode: rotate\n\n# Modes to cycle through\nrotate:\n  modes:\n    - sysmon\n    - matrix\n    - ticker\n    - docker\n    - clock\n  delay: 30  # seconds per mode\n\n# URL mode settings\nurl: http://your-dashboard.local:8421/\n\n# Global settings\nquality: 80            # JPEG quality 1-100\nfps: 24                # target framerate\nrotate_display: 0      # 0, 90, 180, or 270 degrees\n```\n\nCLI flags always override config.yml.\n\n### Auto-Start on Boot\n\n```bash\n# Edit the systemd service to your preference:\nsudo nano /etc/systemd/system/tinyscreen.service\n\n# Enable and start\nsudo systemctl enable tinyscreen\nsudo systemctl start tinyscreen\n```\n\n### Logs\n\n```bash\ntail -f /tmp/tinyscreen.log\n```\n\n## How It Works\n\nThese ArtInChip USB displays require a **proprietary RSA authentication handshake** before they accept any frame data. The Windows driver does this silently, and ArtInChip's official Linux driver (`AiCast`) requires a working DRM display pipeline that conflicts with NVIDIA's proprietary drivers.\n\n**tinyscreen** bypasses the kernel driver entirely and talks directly to the device via USB:\n\n1. **USB enumeration** — Claims the vendor-specific bulk interface (class 0xFF)\n2. **RSA authentication** — Two-phase challenge-response required by device firmware:\n   - *Phase 1 (auth_dev)*: Host encrypts random challenge with RSA public key, device decrypts with private key, returns plaintext\n   - *Phase 2 (auth_host)*: Device sends RSA-signed blob, host recovers plaintext via public key, returns it\n3. **JPEG frame streaming** — 20-byte frame headers + JPEG data over USB bulk transfers\n\nThe protocol was reverse-engineered from the `aic-render` userspace binary and the `aic_drm_ud` kernel module source.\n\n### Performance\n\n| Metric | Value |\n|--------|-------|\n| USB send rate | 265 fps (JPEG q85, 20KB/frame) |\n| Display refresh | 60 Hz (hardware limit) |\n| URL mode (CDP screencast) | 60 fps |\n| CDP screenshot polling | ~9 fps |\n| Sysmon / Docker / Netmon | 2 fps |\n| Matrix / News / Ticker | 30 fps |\n| Audio Visualizer | 60 fps |\n| USB bandwidth used | ~5 MB/s of ~35 MB/s available |\n\n## Dependencies\n\nInstalled automatically by `install.sh`:\n\n- **Python 3.10+** with: `pyusb`, `Pillow`, `cryptography`, `PyYAML`\n- **Chromium or Google Chrome** — headless browser for URL mode\n- **ffmpeg** — video decoding\n- **yt-dlp** *(optional)* — YouTube video support\n- **numpy** *(optional)* — audio visualizer FFT\n- **feedparser** *(optional)* — RSS news crawl\n- **requests** — crypto ticker, weather, CDP communication\n- **websocket-client** — CDP WebSocket for URL mode\n\n## Troubleshooting\n\n### \"ArtInChip USB display not found\"\n\n1. Check the display is plugged in: `lsusb | grep 33c3`\n2. Try a different USB cable — many cables that ship with these displays are faulty\n3. Check dmesg for USB errors: `dmesg | tail -20`\n\n### \"Access denied (insufficient permissions)\"\n\nReplug the USB cable, or run: `sudo udevadm control --reload-rules \u0026\u0026 sudo udevadm trigger`\n\n### Display shows nothing after auth\n\nMake sure the `aic_drm_ud` kernel module isn't loaded: `lsmod | grep aic`. If loaded, blacklist it: `echo \"blacklist aic_drm_ud\" | sudo tee /etc/modprobe.d/blacklist-aic.conf`\n\n### --url mode shows black screen\n\nMake sure no old chromium processes are holding port 9222: `pkill -f 'chromium.*9222'` then retry.\n\n### Video playback is choppy\n\nLower quality (`-q 50`) or framerate (`--fps 15`). USB 2.0 Hi-Speed (480 Mbps) is the bottleneck for video.\n\n## Uninstall\n\n```bash\nsudo /opt/tinyscreen/uninstall.sh\n```\n\n## Technical Details\n\n### USB Protocol\n\n```\nVendor ID:  0x33C3 (ArtInChip)\nProduct ID: 0x0E02\nInterface:  0 (Vendor Specific, Bulk IN EP 0x81, Bulk OUT EP 0x01)\n\nFrame header (20 bytes):\n  u32 magic        = 0xA1C62B01\n  u32 jpeg_length\n  u16 frame_id\n  u16 media_format = 0x10 (JPEG)\n  u32 reserved     = 0\n  u32 magic        = 0xA1C62B01\n\nAuth command (20 bytes, same struct):\n  magic = 0xA1C62B10 (auth_dev) or 0xA1C62B11 (auth_host)\n  length = 0x100 (RSA key size)\n```\n\n### Project Structure\n\n```\n/opt/tinyscreen/\n├── tinyscreen.py          # main driver + daemon + all mode dispatch\n├── tinyscreen             # shell wrapper\n├── tinyscreen-evdi.py     # EVDI virtual display bridge daemon\n├── evdi_wrapper.py        # ctypes bindings for libevdi.so\n├── edid.py                # EDID generator for 1920x440\n├── edid_1920x440.bin      # pre-generated EDID binary\n├── launch-dashboard.sh    # standalone dashboard launcher\n├── configure-display.sh   # xrandr display positioning helper\n├── sysmon.py              # system monitor renderer\n├── config.yml             # default configuration\n├── modes/\n│   ├── ticker.py          # crypto price ticker\n│   ├── clock.py           # clock + animated weather + system info\n│   ├── matrix.py          # matrix digital rain\n│   ├── visualizer.py      # audio spectrum analyzer\n│   ├── nowplaying.py      # MPRIS now playing\n│   ├── docker_mon.py      # docker container monitor\n│   ├── netmon.py          # network connections\n│   ├── newscrawl.py       # RSS news crawl\n│   └── pomodoro.py        # focus timer\n├── tests/\n│   └── test_edid.py       # EDID generator unit tests\n├── tinyscreen-evdi.service # systemd unit for EVDI bridge\n├── install.sh\n└── uninstall.sh\n```\n\n## Contributing\n\nPRs welcome! Especially for:\n- Testing with other ArtInChip display models (0e01, 0e04, 0e05)\n- New display modes\n- Wayland compositor support\n- Custom dashboard templates for the bar form factor\n\n## License\n\nMIT License. See [LICENSE](LICENSE).\n\n## Acknowledgments\n\n- Protocol reverse-engineered from ArtInChip's official [AiCast Linux driver](https://gitee.com/artinchip/luban-lite) and `aic-render` binary\n- ArtInChip Technology Co., Ltd. for the kernel module source (GPL-2.0)\n\n---\n\n**Keywords**: ArtInChip Linux driver, USB bar monitor Linux, ZHAOCAILIN Linux driver, 33c3:0e02 Linux, 1920x440 USB display Linux, stretched bar LCD Linux, AiCast Linux alternative, USB portable monitor Linux driver, ArtInChip RISC-V display, cheap USB monitor Linux, system monitor bar display, hardware dashboard Linux, crypto ticker display, matrix rain display, docker monitor display, CDP screencast display\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhevnsnt%2Fartinchip-linux","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhevnsnt%2Fartinchip-linux","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhevnsnt%2Fartinchip-linux/lists"}