Skip to main content
Portainer Skunkworks

Things we built because we could.

Free tools from the Portainer engineering team. Each one solves a real problem we kept running into. None of them are on the product roadmap. All of them are open source.

These tools carry no support SLA, no guaranteed update cadence, and no roadmap commitment. If something breaks, raise a GitHub issue. If something is useful, tell us... we might build more. KubeSolo is proof that we do.
01 — Active
D2K
github.com/portainer/d2k
Open Source Free

Platform engineering teams are increasingly running shared Kubernetes clusters, but most application developers still think in Docker. D2K bridges that gap. It presents a synthetic Docker API endpoint that translates incoming Docker CLI commands and API calls into the equivalent Kubernetes operations on a shared cluster... letting developers work exactly as they always have, without touching a kubeconfig.

The result is a clean separation: developers get the Docker workflow they know, platform teams keep full Kubernetes control. No retooling of CI pipelines. No Kubernetes training for every developer on the floor.

Target Audience
Platform Engineering teams delivering internal developer platforms on shared Kubernetes clusters
How It Works
Exposes a Docker-compatible HTTP API. Translates calls to Kubernetes Pod and Deployment operations at runtime
Language
Go
Cluster Compatibility
Any conformant Kubernetes distribution: EKS, AKS, GKE, KubeSolo, bare metal
# Developer runs this on their laptop — no Kubernetes knowledge required docker --host tcp://d2k.internal:2375 run -d nginx docker --host tcp://d2k.internal:2375 ps # D2K translates both calls into Kubernetes Deployments on the shared cluster
02 — Active
Portainer Run
github.com/portainer/portainer-run
Open Source Free

Portainer is built for operators. Portainer Run is built for the developers those operators support. It's a self-service developer portal backed by the Portainer API... a Cloud Run-style interface that lets internal developers deploy containers, stream logs, roll back bad images, and diagnose failures without touching Portainer's operator UI or a kubeconfig.

The underlying platform is still Portainer, with all the RBAC and access controls that implies. Portainer Run removes the distance between a developer and their workload. Deploy a container, get a URL, stream logs, inspect revisions, roll back — all from one narrow, purpose-built interface. When something goes wrong, the built-in AI assistant proactively fetches logs, pod conditions, and Kubernetes events across all three levels (Deployment, ReplicaSet, Pod) and triages the failure... including scheduling errors and image pull failures where no application logs exist yet.

Target Audience
Internal developers who need to deploy and operate containerised workloads without operator-level Portainer access
What It Covers
Deploy (single and multi-container sidecars), live log streaming, revision history with rollback, AI-assisted triage, persistent storage, service exposure (NodePort, LoadBalancer, Ingress)
AI Assistant
Context-aware chat on every page. Translates Docker Compose files into deployments, proactively fetches diagnostics, and pre-populates forms from natural language. Requires an Anthropic API key server-side.
Deployment
Three files: portainer-run.html, server.js, Dockerfile. Node.js proxy handles CORS and keeps credentials server-side. Self-signed TLS by default.
# Run it — point it at your Portainer instance docker run -d -p 443:443 -p 80:80 \ -e PORTAINER_URL=https://portainer.example.com:9443 \ -e ANTHROPIC_API_KEY=sk-ant-... \ --name portainer-run portainer-run # Developer navigates to https://your-host, enters a PAT, and deploys
03 — Active
portainerctl
github.com/portainer/portainerctl
Open Source Free

A full-featured CLI for Portainer Business Edition that covers the complete REST API. Environments, stacks, containers, Kubernetes workloads, edge compute, users, teams, RBAC, registries, GitOps, webhooks, backups, licensing, observability... all of it, from the command line.

If you're scripting Portainer operations, building CI/CD pipelines that interact with Portainer, or just prefer a terminal to a browser, portainerctl gives you full API coverage with consistent JSON, YAML, or table output and multi-context support for managing multiple Portainer instances.

Target Audience
Platform engineers and DevOps teams automating Portainer operations or integrating it into CI/CD pipelines
Portainer Version
Portainer Business Edition 2.39.1+. BE-only endpoints (RBAC, licensing, edge compute, policies) return 403 on CE installs
Platforms
Linux, macOS, Windows — amd64, arm64, armv7. Single binary, no dependencies
Language
Go. Build from source with Go 1.22+ or grab a binary from the releases page
# Install curl -L https://github.com/portainer/portainerctl/releases/latest/download/portainerctl_linux_amd64.tar.gz | tar xz sudo mv portainerctl /usr/local/bin/ # Add a context and start using it portainerctl config add-context --name prod --url https://portainer.example.com --token pt_yourtoken portainerctl env list portainerctl stack list --env 2 -o json | jq '.[] | select(.type == "compose")' portainerctl container logs abc123 --env 2 --tail 200
04 — Active
Krill
Native iOS & Android for Portainer
Free Open Source

Portainer's web UI works in a mobile browser, but that's not the same as a native app. Krill is a native iOS and Android application for Portainer... built for engineers who are on call, on the factory floor, or just away from a desk when something needs attention.

Connect to any Portainer instance, monitor environment health, inspect containers and stacks, and take action when you need to. The same Portainer API that powers the web UI powers Krill. Everything you can see in the browser, you can see on your phone.

Platforms
iOS (App Store) and Android (Google Play)
Connects To
Any Portainer CE or BE instance accessible from the device. Supports multiple instances
Authentication
Portainer username/password or API token
Cost
Free. No in-app purchases. No subscription.
# Krill talks directly to the Portainer REST API GET /api/endpoints # list environments GET /api/endpoints/{id}/docker/containers/json # list containers POST /api/endpoints/{id}/docker/containers/{cid}/restart # restart
05 — Graduated
KubeSolo
kubesolo.io
Graduated to Product Open Source
KubeSolo started here as a Skunkworks experiment. It now has its own dedicated site, its own product page, and an active development roadmap. This is what graduation looks like. See the full product page.

The question was straightforward: why does running a single-node Kubernetes cluster still require so much operational ceremony? K3s, K0s, MicroK8s all work, but none were built with the Portainer operator in mind. KubeSolo is a single-node Kubernetes distribution built specifically for edge, IoT, and resource-constrained environments, and packaged to integrate natively with Portainer from day one.

It ships as a single binary. No kubeadm, no etcd cluster, no control-plane setup. Just Kubernetes on a single node, managed through Portainer. What started as a Skunkworks experiment to answer one question became a standalone project with its own community and a clear roadmap.

Target Environments
Edge, IoT, OT — anywhere a full multi-node cluster is impractical but Kubernetes is needed
Distribution Model
Single binary. Minimal footprint. Integrates with Portainer out of the box
Status
Active development. Dedicated site at kubesolo.io. Full product support available
License
Open source. Free to use.
# Install and start KubeSolo on a Linux node curl -sfL https://get.kubesolo.io | sh - kubesolo start # Portainer agent connects and registers the node automatically # Manage it from Portainer like any other Kubernetes environment
What's next

We're building more.

If you're using one of these tools, or have a problem you think we should take a look at, we want to hear about it. The best Skunkworks projects start with a real operational problem nobody has properly solved.