{"id":34611554,"url":"https://github.com/anders94/waveshare-epaper","last_synced_at":"2026-01-20T17:35:10.790Z","repository":{"id":314683561,"uuid":"1056402188","full_name":"anders94/waveshare-epaper","owner":"anders94","description":"A modular Node.js driver for Waveshare E-Paper displays that supports multiple display models with different resolutions and color modes","archived":false,"fork":false,"pushed_at":"2025-09-27T13:14:10.000Z","size":124,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-27T15:12:03.320Z","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":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/anders94.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-09-14T02:33:22.000Z","updated_at":"2025-09-27T13:14:14.000Z","dependencies_parsed_at":"2025-09-14T04:23:16.379Z","dependency_job_id":"e4d03e89-30d8-4415-b7be-d6188398bc49","html_url":"https://github.com/anders94/waveshare-epaper","commit_stats":null,"previous_names":["anders94/waveshare-epaper"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/anders94/waveshare-epaper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anders94%2Fwaveshare-epaper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anders94%2Fwaveshare-epaper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anders94%2Fwaveshare-epaper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anders94%2Fwaveshare-epaper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/anders94","download_url":"https://codeload.github.com/anders94/waveshare-epaper/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anders94%2Fwaveshare-epaper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28003726,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-24T02:00:07.193Z","response_time":83,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":"2025-12-24T14:16:05.923Z","updated_at":"2025-12-24T14:16:08.113Z","avatar_url":"https://github.com/anders94.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Waveshare E-Paper Node.js Driver\n\n[![npm version](https://badge.fury.io/js/waveshare-epaper.svg)](https://www.npmjs.com/package/waveshare-epaper)\n\nA modular Node.js driver for Waveshare E-Paper displays that supports multiple display models with different resolutions and color modes.\n\n## Features\n\n- **Modular architecture**: Easy to extend with new display models\n- **Multiple display support**: Currently supports 8+ display models with more easily added\n- **Color mode support**: Monochrome, grayscale and color modes where supported by hardware\n- **Common API**: Unified interface across all display models\n- **Hardware abstraction**: Base class handles common SPI/GPIO operations\n- **PNG image loading**: Built-in support for loading and displaying PNG images\n\n## Supported Displays\n\nNot all devices have been tested in the field. Please create a GitHub issue if you have confirmed one of the untested platforms working.\n\n| Model     | Resolution  | Color Modes       | Description                        | Status            |\n|-----------|-------------|-------------------|------------------------------------|-------------------|\n| 2in13     | 122 × 250   | Monochrome        | 2.13\" black/white                  | Untested          |\n| 2in7      | 176 × 264   | Mono, 4-grayscale | 2.7\" with grayscale support        | Untested          |\n| 2in7b     | 176 × 264   | 3-color           | 2.7\" black/white/red or yellow     | Untested          |\n| 7in5      | 640 × 384   | Monochrome        | 7.5\" black/white                   | Confirmed working |\n| 7in3f     | 800 × 480   | 7-color           | 7.3\" full color (7 colors)         | Untested          |\n| 13in3k    | 960 × 680   | Mono, 4-grayscale | 13.3\" with grayscale support       | Confirmed working |\n| 13in3b    | 960 × 680   | 3-color           | 13.3\" black/white/red or yellow    | Untested          |\n| 13in3gray | 1600 × 1200 | 16-grayscale      | 13.3\" 16-level grayscale (IT8951)  | Untested          |\n\n## Installation\n\n```bash\nnpm install waveshare-epaper\n```\n\n### GPIO Permissions (Recommended)\nFor security, add your user to the `gpio` group instead of running as root:\n\n```bash\n# Add current user to gpio group\nsudo usermod -a -G gpio $USER\n\n# Log out and back in, then verify group membership\ngroups\n```\n\nAfter logging back in, you can run GPIO programs without `sudo`.\n\n## Quick Start\n\n### 13.3\" 4-grayscale Example\n```javascript\nconst { createDisplay } = require('waveshare-epaper');\n\n(async () =\u003e {\n    // Create display instance (13.3\" 4-grayscale)\n    const epd = createDisplay('13in3k', '4gray', {\n        rstPin: 17,\n        dcPin: 25,\n        busyPin: 24,\n        pwrPin: 18\n    });\n\n    // Initialize and use\n    await epd.init();\n    await epd.clear();\n\n    // Draw with different gray levels (0=black, 1=dark gray, 2=light gray, 3=white)\n    epd.drawRect(10, 10, 100, 50, 0, true);   // Black filled rectangle\n    epd.drawRect(120, 10, 100, 50, 1, true);  // Dark gray rectangle\n    epd.drawRect(230, 10, 100, 50, 2, true);  // Light gray rectangle\n    epd.drawLine(10, 80, 330, 80, 0);         // Black line\n\n    // Update display\n    await epd.display();\n    await epd.sleep();\n})();\n```\n\n### 16-grayscale Example (IT8951 Controller)\n```javascript\nconst { createDisplay } = require('waveshare-epaper');\n\n(async () =\u003e {\n    const epd = createDisplay('13in3gray', '16gray', {\n        rstPin: 17,\n        dcPin: 25,\n        busyPin: 24,\n        pwrPin: 18,\n        vcom: -2.30  // Adjust according to your display\n    });\n\n    await epd.init();\n    await epd.clear();\n\n    // Draw with 16 different gray levels (0=black, 15=white)\n    const cellWidth = 100;\n    for (let i = 0; i \u003c 16; i++) {\n        const x = (i % 8) * cellWidth;\n        const y = Math.floor(i / 8) * 60;\n        epd.drawRect(x, y, cellWidth - 2, 58, i, true);\n    }\n\n    // Display with high quality GC16 mode\n    await epd.display('GC16');\n    await epd.sleep();\n})();\n```\n\n### Canvas Example\nRequires: `npm install canvas`\n\n```javascript\nconst { createDisplay } = require('waveshare-epaper');\n\n(async () =\u003e {\n    const { createCanvas } = require('canvas');\n    const epd = createDisplay('13in3k', '4gray', {\n        rstPin: 17, dcPin: 25, busyPin: 24, pwrPin: 18\n    });\n\n    await epd.init();\n\n    // Create a simple canvas\n    const canvas = createCanvas(400, 200);\n    const ctx = canvas.getContext('2d');\n\n    // White background\n    ctx.fillStyle = 'white';\n    ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n    // Draw text and shapes\n    ctx.fillStyle = 'black';\n    ctx.font = '36px Arial';\n    ctx.fillText('Canvas Demo', 50, 100);\n\n    // Draw a rectangle around the text\n    ctx.strokeStyle = 'gray';\n    ctx.lineWidth = 2;\n    ctx.strokeRect(10, 10, 380, 180);\n\n    // Draw to display\n    await epd.drawCanvas(canvas, 100, 100);\n    await epd.display();\n    await epd.sleep();\n})();\n```\n\n## API Reference\n\n### Factory Functions\n\n#### `createDisplay(model, colorMode, options)`\nCreates a display instance for the specified model.\n\n- `model` (string): Display model ('2in13', '2in7', '2in7b', '7in5', '7in3f', '13in3k', '13in3b', '13in3gray')\n- `colorMode` (string): Color mode ('mono', '4gray', '16gray', '3color', '7color') - must be supported by the display\n- `options` (object): Configuration options\n\n**Options:**\n- `rstPin` (number): Reset GPIO pin (default: 17)\n- `dcPin` (number): Data/Command GPIO pin (default: 25)\n- `busyPin` (number): Busy GPIO pin (default: 24)\n- `csPin` (number): Chip Select GPIO pin (default: 22)\n- `pwrPin` (number): Power control GPIO pin (default: 18)\n- `gpioChip` (string): GPIO chip name (default: 'gpiochip0')\n- `busNumber` (number): SPI bus number (default: 0)\n- `deviceNumber` (number): SPI device number (default: 0)\n- `maxSpeedHz` (number): SPI max speed (default: 4000000)\n- `accentColor` (string): For 3-color displays, specify 'red' or 'yellow' accent color\n- `vcom` (number): VCOM voltage for IT8951 displays (default: -2.30)\n\n#### `getSupportedModels()`\nReturns array of supported models with their specifications.\n\n### Display Methods\n\n#### Basic Operations\n- `await epd.init()` - Initialize the display\n- `await epd.clear()` - Clear display to background color\n- `await epd.display()` - Update the display with current buffer\n- `await epd.sleep()` - Put display into low power mode\n- `await epd.cleanup()` - Clean up resources\n\n#### Power Control\n- `await epd.powerOn()` - Turn on display power (automatically called during init)\n- `await epd.powerOff()` - Turn off display power (automatically called during cleanup)\n\n#### Drawing Functions\n- `epd.setPixel(x, y, color)` - Set individual pixel\n- `epd.drawLine(x0, y0, x1, y1, color)` - Draw line\n- `epd.drawRect(x, y, width, height, color, filled)` - Draw rectangle\n- `await epd.drawPNG(filePath, x, y)` - Load and draw PNG image\n- `await epd.drawCanvas(canvas, x, y)` - Draw HTML5 Canvas object\n\n#### Enhanced Drawing (Color Displays)\n**7-color displays:**\n- `epd.setPixelColor(x, y, colorName)` - Set pixel using color name\n- `epd.drawColorLine(x0, y0, x1, y1, colorName)` - Draw colored line\n- `epd.drawColorRect(x, y, w, h, colorName, filled)` - Draw colored rectangle\n- `await epd.show7Block()` - Display all 7 colors in blocks\n\n**3-color displays:**\n- `epd.drawBlackRect(x, y, w, h, filled)` - Draw black rectangle\n- `epd.drawRedRect(x, y, w, h, filled)` - Draw accent color rectangle\n- `await epd.show3ColorTest()` - Display 3-color test pattern\n\n#### Color Values\n- **Monochrome mode**: `0` = black, `1` = white\n- **4-grayscale mode**: `0` = black, `1` = dark gray, `2` = light gray, `3` = white\n- **16-grayscale mode**: `0` = black, `1-14` = varying gray levels, `15` = white\n- **3-color mode**: `0` = black, `1` = white, `2` = accent color (red or yellow, configurable)\n- **7-color mode**: `0` = black, `1` = white, `2` = green, `3` = blue, `4` = red, `5` = yellow, `6` = orange\n\n#### Color Names (7-color displays)\nFor 7-color displays, you can use color names:\n```javascript\nepd.setPixelColor(x, y, 'RED');\nepd.drawColorRect(10, 10, 100, 50, 'BLUE', true);\nepd.drawColorLine(0, 0, 100, 100, 'GREEN');\n```\nAvailable colors: `BLACK`, `WHITE`, `RED`, `GREEN`, `BLUE`, `YELLOW`, `ORANGE`\n\n## Architecture\n\n### File Structure\n```\n├── index.js              # Main entry point and factory functions\n├── EPDBase.js             # Base class with common functionality\n├── displays/\n│   ├── index.js           # Display module exports\n│   ├── EPD2in13.js        # 2.13\" monochrome display driver\n│   ├── EPD2in7.js         # 2.7\" mono/4-grayscale display driver\n│   ├── EPD2in7b.js        # 2.7\" 3-color display driver\n│   ├── EPD7in5.js         # 7.5\" monochrome display driver\n│   ├── EPD7in3f.js        # 7.3\" 7-color display driver\n│   ├── EPD13in3k.js       # 13.3\" mono/4-grayscale display driver\n│   ├── EPD13in3b.js       # 13.3\" 3-color display driver\n│   └── EPD13in3Gray.js    # 13.3\" 16-grayscale display driver (IT8951)\n├── examples/              # Usage examples for each feature\n└── README.md              # This file\n```\n\n### Extending with New Displays\n\nTo add support for a new display model:\n\n1. Create a new file in `displays/` (e.g., `EPDNewModel.js`)\n2. Extend `EPDBase` class:\n   ```javascript\n   const EPDBase = require('../EPDBase');\n\n   class EPDNewModel extends EPDBase {\n       constructor(options = {}) {\n           super(options);\n           this.width = 200;    // Set display width\n           this.height = 200;   // Set display height\n           this.colorMode = options.colorMode || 'mono';\n           this.bitsPerPixel = this.colorMode === '4gray' ? 2 : 1;\n           this.initializeBuffer();\n       }\n\n       async initDisplay() {\n           // Implement display-specific initialization\n       }\n\n       async displayImage() {\n           // Implement display-specific image update\n       }\n   }\n   ```\n\n3. Add to `displays/index.js` exports\n4. Add case to `createDisplay()` function\n\n## Hardware Requirements\n\n### System Requirements\n- Raspberry Pi with SPI enabled\n- `gpiod` tools installed (`apt install gpiod`)\n- Node.js 14+ (recommended: Node.js 18+)\n\n### Raspberry Pi Model Compatibility\n\n| Model            | GPIO Chip       | Pin Layout        | SPI Interface    | Initialization Notes             |\n|------------------|-----------------|-------------------|------------------|----------------------------------|\n| Pi 1 Model A/B   | `gpiochip0`     | 26-pin (original) | `/dev/spidev0.0` | Limited pins, use adapted wiring |\n| Pi 1 Model A+/B+ | `gpiochip0`     | 40-pin            | `/dev/spidev0.0` | Full compatibility               |\n| Pi 2 Model B     | `gpiochip0`     | 40-pin            | `/dev/spidev0.0` | Full compatibility               |\n| Pi 3 Model A+/B+ | `gpiochip0`     | 40-pin            | `/dev/spidev0.0` | Full compatibility               |\n| Pi 4 Model B     | `gpiochip0`     | 40-pin            | `/dev/spidev0.0` | Full compatibility               |\n| **Pi 5**         | **`gpiochip4`** | 40-pin            | `/dev/spidev0.0` | **Requires gpioChip option**     |\n\n#### Raspberry Pi 5 Configuration\n**Critical**: Pi 5 uses `gpiochip4` instead of `gpiochip0`. You **must** specify this in your configuration or initialization will fail:\n\n```javascript\nconst epd = createDisplay('13in3k', 'mono', {\n    rstPin: 17,\n    dcPin: 25,\n    busyPin: 24,\n    pwrPin: 18,\n    gpioChip: 'gpiochip4'  // Required for Pi 5\n});\n```\n\n#### Legacy Pi Models (26-pin)\nOriginal Pi 1 Model A/B have only 26 GPIO pins. Use this pin mapping:\n- RST: GPIO 17 ✓ (available)\n- DC: GPIO 25 ✓ (available)\n- CS: GPIO 22 ✓ (available)\n- BUSY: GPIO 24 ✓ (available)\n- PWR: GPIO 18 ✓ (available)\n\n### GPIO Pin Connections\nThe following GPIO pins are required for proper operation:\n\n| Function | Default Pin | Description                                                   |\n|----------|-------------|---------------------------------------------------------------|\n| RST      | GPIO 17     | Reset signal (output)                                         |\n| DC       | GPIO 25     | Data/Command signal (output)                                  |\n| CS       | GPIO 22     | SPI Chip Select (output)                                      |\n| BUSY     | GPIO 24     | Busy status signal (input)                                    |\n| **PWR**  | **GPIO 18** | **Power control (output) - Critical for cold boot operation** |\n\n**Important**: The power pin (PWR) is **essential for reliable operation**, especially when cold-booting the Raspberry Pi. Many Waveshare e-paper displays require explicit power control to function properly. Without this pin, the display may:\n- Not respond to commands after a cold boot\n- Work only after running other display programs first\n- Show inconsistent initialization behavior\n\n### SPI Configuration\nThe driver uses SPI interface with these default settings:\n- SPI Bus: `/dev/spidev0.0` (bus 0, device 0)\n- Speed: 4 MHz (configurable)\n- Mode: SPI Mode 0 (CPOL=0, CPHA=0)\n\n### Enable SPI on Raspberry Pi\n```bash\nsudo raspi-config\n# Navigate to: Interfacing Options → SPI → Enable\n# Or add to /boot/config.txt:\necho \"dtparam=spi=on\" | sudo tee -a /boot/config.txt\nsudo reboot\n```\n\n## Troubleshooting\n\n### Display Not Working After Cold Boot\n\n**Symptoms**: Display appears to initialize (no errors) but screen doesn't update, or works only after running manufacturer's example programs.\n\n**Cause**: Missing power pin configuration. Many Waveshare displays have internal power management that requires explicit control.\n\n**Solution**: Always specify the power pin in your configuration:\n\n```javascript\nconst epd = createDisplay('13in3k', 'mono', {\n    rstPin: 17,\n    dcPin: 25,\n    busyPin: 24,\n    pwrPin: 18\n});\n```\n\n### Common GPIO Issues\n\n**Permission errors**: Make sure you're running with appropriate permissions or add your user to the `gpio` group:\n```bash\nsudo usermod -a -G gpio $USER\n# Then log out and back in\n```\n\n**GPIO already in use**: If you see \"Device or resource busy\" errors, check what's using the GPIO pins:\n```bash\n# Check what's using GPIO pins\nsudo lsof /dev/gpiomem\n# Or check specific pins\ngpioinfo | grep -E \"(17|18|24|25)\"\n```\n\n### Auto-Detection and Troubleshooting\n\n#### Checking Your GPIO Chip\nIf you're unsure which GPIO chip your Pi uses, run:\n```bash\ngpioinfo | head -n 1\n```\n\nFor Pi 5, you'll see: `gpiochip4 - 54 lines`\nFor older Pi models: `gpiochip0 - 54 lines` (or similar)\n\n#### Environment Variable (Alternative)\nYou can also set the GPIO chip via environment variable:\n```bash\nexport GPIO_CHIP=gpiochip4  # For Pi 5\nnode your-epd-program.js\n```\n\nThen check for this variable in your code:\n```javascript\nconst epd = createDisplay('13in3k', 'mono', {\n    gpioChip: process.env.GPIO_CHIP || 'gpiochip0'\n});\n```\n\n### Cairo Error\n\nIf while loading canvas you get this error:\n\n```\nError: libcairo.so.2: ELF load command address/offset not page-aligned\n```\n\nTru removing canvas and re-installing by compiling from source.\n\n```\nrm -fr node_modules/canvas/\nnpm install canvas --build-from-source\n```\n\nThis can happen if you compile Node.js from source because the precompiled ciaro library that comes with canvas might not be compatible with what you have.\n\n## Examples\n\nSee the [examples/](examples/) directory for working examples of each feature. Each example demonstrates a specific capability and can be copied directly into your projects.\n\n### Usage Examples\n\n#### 7-Color Display Example\n```javascript\nconst epd = createDisplay('7in3f', '7color');\nawait epd.init();\n\n// Show all 7 colors in blocks\nawait epd.show7Block();\n\n// Draw using color names\nepd.drawColorRect(50, 50, 100, 80, 'RED', true);\nepd.drawColorLine(0, 100, 800, 100, 'BLUE');\nepd.setPixelColor(10, 10, 'GREEN');\n\nawait epd.display();\n```\n\n#### 3-Color Display Example\n```javascript\n// Black/White/Red display\nconst epd = createDisplay('13in3b', 'red');\n// Or Black/White/Yellow display\nconst epd = createDisplay('13in3b', 'yellow');\n\nawait epd.init();\n\n// Draw in different colors\nepd.drawBlackRect(50, 50, 200, 100, true);  // Black rectangle\nepd.drawRedRect(300, 50, 200, 100, true);   // Accent color rectangle\n// White is the background color\n\n// Show test pattern\nawait epd.show3ColorTest();\n```\n\n#### Canvas Support\nThe `drawCanvas()` method allows rendering HTML5 Canvas objects directly to the display. This enables dynamic text rendering with TrueType fonts, graphics drawing, and complex layouts:\n\n```javascript\nconst { createCanvas, registerFont } = require('canvas');\n\n// Register a TrueType font\nregisterFont('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', { family: 'MyFont' });\n\n// Create and configure canvas\nconst canvas = createCanvas(800, 400);\nconst ctx = canvas.getContext('2d');\n\n// White background\nctx.fillStyle = 'white';\nctx.fillRect(0, 0, canvas.width, canvas.height);\n\n// Draw text with custom font\nctx.fillStyle = 'black';\nctx.font = '48px MyFont';\nctx.textAlign = 'center';\nctx.fillText('Hello E-Paper!', canvas.width / 2, canvas.height / 2);\n\n// Draw graphics\nctx.strokeStyle = 'black';\nctx.lineWidth = 3;\nctx.strokeRect(10, 10, canvas.width - 20, canvas.height - 20);\n\n// Render to display\nawait epd.drawCanvas(canvas, 0, 0);\n```\n\n**Canvas Features:**\n- TrueType font rendering with `canvas` package\n- Text, shapes, gradients, and complex graphics\n- Automatic color conversion for all display modes\n- Transparency support (transparent pixels become background color)\n- Full HTML5 Canvas API compatibility\n\n**Requirements:**\nInstall the `canvas` package for Canvas support:\n```bash\nnpm install canvas\n```\n\nSee `canvas-example.js` for a complete working example.\n\n#### Advanced Color Detection\nThe driver automatically converts PNG images to the appropriate color format:\n```javascript\n// 7-color display will convert RGB to nearest of 7 colors\nawait epd.drawPNG('colorful-image.png', 0, 0);\n\n// 3-color display will detect red/yellow regions and convert others to black/white\nawait epd.drawPNG('mixed-color-image.png', 0, 0);\n```\n\n## Migration from Original Code\n\nThe original display classes are still available for backward compatibility:\n\n```javascript\nconst { EPD13in3k } = require('waveshare-epaper');\nconst epd = new EPD13in3k();\n```\n\nHowever, using the new factory function is recommended:\n\n```javascript\nconst { createDisplay } = require('waveshare-epaper');\nconst epd = createDisplay('13in3k', 'mono');\n```\n\n## Publishing\n\nTo publish a new version to npm:\n\n```bash\nnpm version patch  # or minor/major\nnpm publish\n```\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\nBased on Waveshare example code.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanders94%2Fwaveshare-epaper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanders94%2Fwaveshare-epaper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanders94%2Fwaveshare-epaper/lists"}