Skip to content

Repository files navigation

"Buy Me A Coffee"

Inker v0.4.0

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 — Grafana panel integration with dashboard picker, live preview, and section grid compositing. More homelab-native plugins coming soon!
  • 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 DesignerDevicesScreens
DevicesScreensScreen Designer
List of sourcesCustom Data SourcesCustom Widgets
ExtensionsCustom data sourcesCustom widgets
Grafana Plugin
image
#1 Example Grafana#2 Example Grafana
imageimage

Quick start & Technical information

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.ymlservices:
inker:
image: wojooo/inker:latestcontainer_name: inkerrestart: unless-stoppedports:
- "80:80"volumes:
- postgres_data:/var/lib/postgresql/17/main
- redis_data:/data
- uploads_data:/app/uploadsenvironment:
TZ: UTCADMIN_PIN: "1111"# Quotes required — YAML strips leading zeros without themvolumes:
postgres_data:
redis_data:
uploads_data:
docker compose up -d

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

Configuration

VariableDescriptionDefault
ADMIN_PINLogin PIN1111
TZTimezone for widgetsUTC
INKER_PORTExternal port (for custom port mapping, e.g. INKER_PORT=800)80
CORS_ORIGINSAllowed 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 testscd frontend && bun run test# 19 tests

License

Source Available — see LICENSE for details.

About

BYOS server written in TypeScript / React / Prisma

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages