Skip to content

usetrmnl/inker

Repository files navigation

"Buy Me A Coffee"

Inker v0.3.1

Self-hosted e-ink device management server built for the homelab community. Works with TRMNL devices (supports firmware 1.7.8) and any BYOD e-ink display. Design screens, create custom widgets with live data from your local network, and manage your displays from a modern web interface.

Inker is heading in its own direction — focusing on homelab integrations like server monitoring, smart home dashboards, network stats, and self-hosted service displays. TRMNL device compatibility is maintained, but the plugin ecosystem will be Inker-native.

Dashboard

Features

  • Screen Designer — Drag & drop widget placement, snap guides, freehand drawing, auto-fit zoom for any resolution
  • Built-in Widgets — Clock, date, text, weather, countdown, days until, QR code, image, GitHub stars, battery, WiFi, device info
  • Custom Widgets — Connect to any JSON API or RSS feed (including local network sources), JavaScript transformations, grid layouts
  • Plugins — Coming soon — homelab-native integrations for server monitoring, smart home, network stats
  • Playlists — Rotate multiple screens on devices automatically
  • Device Management — Auto-provisioning, firmware 1.7.8 support, real-time status, logs
  • BYOD Support — Register any e-ink device manually with custom screen resolution
  • Custom Ports — Run on any port with Docker port mapping (e.g. 800:80)

Screenshots

Screen Designer Devices Screens
Devices Screens Screen Designer
List of sources Custom Data Sources Custom Widgets
Extensions Custom data sources Custom widgets

Quick start

Docker Run

docker run -d \
  --name inker \
  --restart unless-stopped \
  -p 80:80 \
  -v inker_postgres:/var/lib/postgresql/17/main \
  -v inker_redis:/data \
  -v inker_uploads:/app/uploads \
  wojooo/inker:latest

Docker Compose

# docker-compose.yml
services:
  inker:
    image: wojooo/inker:latest
    container_name: inker
    restart: unless-stopped
    ports:
      - "80:80"
    volumes:
      - postgres_data:/var/lib/postgresql/17/main
      - redis_data:/data
      - uploads_data:/app/uploads
    environment:
      TZ: UTC
      ADMIN_PIN: "1111"  # Quotes required — YAML strips leading zeros without them

volumes:
  postgres_data:
  redis_data:
  uploads_data:
docker compose up -d

Open http://your-server-ip and log in with PIN 1111.

Configuration

Variable Description Default
ADMIN_PIN Login PIN 1111
TZ Timezone for widgets UTC
INKER_PORT External port (for custom port mapping, e.g. INKER_PORT=800) 80
CORS_ORIGINS Allowed CORS origins (comma-separated, or * for all) same-origin

Pass with -e:

docker run -d \
  --name inker \
  --restart unless-stopped \
  -p 80:80 \
  -e ADMIN_PIN="1111" \
  -e TZ=Europe/Warsaw \
  -v inker_postgres:/var/lib/postgresql/17/main \
  -v inker_redis:/data \
  -v inker_uploads:/app/uploads \
  wojooo/inker:latest

Build from source

git clone https://github.com/wojo-o/inker.git
cd inker
docker compose up -d --build

Updating

docker compose pull
docker compose up -d

All data (screens, devices, playlists, settings) is preserved — database schema updates are applied automatically on startup.

Warning: Never use docker compose down -v to update — the -v flag deletes all volumes and you will lose your data.

Troubleshooting

If something isn't working after an update or on first run, reset the volumes and start fresh:

docker compose down -v
docker compose up -d

Note: This removes all data (database, uploads). Only use on a fresh install or when you don't mind losing data.

Testing

cd backend && bun test      # 395 tests
cd frontend && bun run test  # 19 tests

License

Source Available — see LICENSE for details.

About

BYOS server written in TypeScript / React / Prisma

Topics

Resources

License

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Languages