{"id":51418821,"url":"https://github.com/appthrust/spind","last_synced_at":"2026-07-04T22:30:46.008Z","repository":{"id":365788906,"uuid":"1271025403","full_name":"appthrust/spind","owner":"appthrust","description":"Fast local Kubernetes development environments using microVM snapshots and kind-based setup","archived":false,"fork":false,"pushed_at":"2026-06-18T21:40:13.000Z","size":276,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-18T23:19:35.976Z","etag":null,"topics":["go","kind","kubernetes","linux","local-development","macos","microvm","snapshots"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/appthrust.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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-06-16T09:07:13.000Z","updated_at":"2026-06-16T09:26:12.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/appthrust/spind","commit_stats":null,"previous_names":["appthrust/spind"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/appthrust/spind","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appthrust%2Fspind","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appthrust%2Fspind/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appthrust%2Fspind/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appthrust%2Fspind/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/appthrust","download_url":"https://codeload.github.com/appthrust/spind/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appthrust%2Fspind/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35138074,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-04T02:00:05.987Z","response_time":113,"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":["go","kind","kubernetes","linux","local-development","macos","microvm","snapshots"],"created_at":"2026-07-04T22:30:45.902Z","updated_at":"2026-07-04T22:30:45.985Z","avatar_url":"https://github.com/appthrust.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# spind\n\nspind is a fast local development environment for people who build web applications that use the Kubernetes API, and for people who build Kubernetes Operators.\n\nIt supports kind-based and k3d-based Kubernetes environments and makes clean environments fast to create, reset, and start.\n\n## Why spind?\n\nKubernetes development and testing often need a clean Kubernetes environment. Creating that environment every time is slow.\n\nCommon setup steps can take seconds or minutes:\n\n- `kind create cluster` can take about 30 seconds.\n- `helm install` can take several minutes.\n- End-to-end tests and integration tests often need a clean cluster.\n- CI runs can spend several minutes only preparing the environment.\n\nDuring development, you often create an environment, test something, break it, delete it, and create it again. That wait makes the development loop slow.\n\nspind reduces setup time from minutes to less than 1000 ms by restoring a ready VM snapshot.\n\nThis makes development, manual checks, end-to-end tests, integration tests, CI, and CD faster.\n\n## How it works\n\nspind is built around microVMs and snapshots.\n\nOn macOS, spind starts a small Linux VM with Virtualization.framework. On Linux, spind starts a small Linux VM with Cloud Hypervisor.\n\nThe Linux VM is not a special Kubernetes system. It is a small Docker machine. You can use your normal Docker client, kind, kubectl, and helm.\n\nspind sets up the runtime VM once, then saves that ready state as a snapshot. After that, spind restores from the snapshot. This lets you start an environment where the Kubernetes cluster and Helm charts are already prepared.\n\n## Use cases\n\n- Web applications that use the Kubernetes API\n- Kubernetes Operator development\n- Local Kubernetes development with kind or k3d\n- Clean environments for end-to-end tests and integration tests\n- Faster Kubernetes environment setup in CI/CD\n\n## Install\n\nInstall spind with `go install`.\n\n```sh\ngo install github.com/suin/spind/cmd/spind@latest\n```\n\nAfter installing, check your host dependencies.\n\n```sh\nspind doctor\n```\n\n## Dependencies\n\n`spind doctor` checks the dependencies needed on your current host. This section gives the basic list.\n\nCommon:\n\n- Go\n- Docker CLI\n\nmacOS:\n\n- Apple Swift compiler\n- `codesign`\n- Xcode Command Line Tools\n- A macOS environment that supports Virtualization.framework\n\nLinux:\n\n- A Linux environment with KVM support\n- `/dev/kvm`\n- `cloud-hypervisor`\n- `passt`\n- `virtiofsd`\n\nDocker image builds need the Docker CLI. On Linux, `passt` and `virtiofsd` are also used for Docker host support, snapshot restore support, and host path sharing.\n\n## Basic usage\n\nPut `spind.yaml` in your project root.\n\n```yaml\nname: sample\nimage: docker\nk8s: kind\nsetup:\n  - \"kind create cluster\"\n  - \"kubectl --context kind-kind wait node --all --for=condition=Ready --timeout=180s\"\n```\n\nStart the development environment.\n\n```sh\nspind up\n```\n\nOn the first run, spind creates a VM, runs the commands in `setup`, and saves the ready state as a snapshot. Later runs restore from that snapshot.\n\n## Guide for kind users\n\nUse `k8s: kind` when your project uses kind.\n\n```yaml\nname: sample\nimage: docker\nk8s: kind\nsetup:\n  - \"kind create cluster\"\n  - \"kubectl --context kind-kind wait node --all --for=condition=Ready --timeout=180s\"\n```\n\nRun `spind up`.\n\n```sh\nspind up\n```\n\nAfter the environment starts, spind prints shell exports for the restored VM.\n\n```sh\nexport DOCKER_HOST='unix:///.../.spind/vms/sample/docker.sock'\nexport KUBECONFIG='/.../.spind/vms/sample/kubeconfig'\n```\n\nUse those values in the current shell, then use your usual tools.\n\n```sh\nkubectl get nodes\ndocker ps\n```\n\nspind does not update your global kubeconfig by default. The kubeconfig path printed by `spind up` is the VM-specific kubeconfig.\n\n## Guide for k3d users\n\nUse `k8s: k3d` when your project uses k3d.\n\n```yaml\nname: k3d-sample\nimage: docker\nk8s: k3d\nsetup:\n  - \"k3d cluster create k3d-sample --registry-create k3d-sample-registry --kubeconfig-update-default=false\"\n  - 'k3d kubeconfig get k3d-sample \u003e \"$SPIND_KUBECONFIG\"'\n  - \"kubectl --context k3d-k3d-sample wait node --all --for=condition=Ready --timeout=180s\"\n```\n\n`SPIND_KUBECONFIG` is a path that spind sets for setup commands. Write the k3d kubeconfig there so spind can save it in the snapshot and rewrite it after restore.\n\nWhen the k3d cluster has a local registry, spind detects it and prints `REGISTRY`.\n\n```sh\nexport DOCKER_HOST='unix:///.../.spind/vms/k3d-sample/docker.sock'\nexport KUBECONFIG='/.../.spind/vms/k3d-sample/kubeconfig'\nexport REGISTRY='localhost:61702'\n```\n\nUse `REGISTRY` with the `DOCKER_HOST` value printed by spind.\n\n```sh\ndocker build -t \"$REGISTRY/my-app:dev\" .\ndocker push \"$REGISTRY/my-app:dev\"\n```\n\nFor k3d, `k3d registry list` may show a port that is different from the `REGISTRY` value printed by spind. In a spind environment, use the `REGISTRY` value printed by `spind up` or `spind vm start`.\n\nSee `examples/k3d/spind.yaml` for a k3d sample with cert-manager.\n\n## Guide for Tilt users\n\nTilt works with the same `DOCKER_HOST` and `KUBECONFIG` values that spind prints.\n\nStart the spind environment first.\n\n```sh\nspind up\n```\n\nThen export the values printed by spind in your shell.\n\n```sh\nexport DOCKER_HOST='unix:///.../.spind/vms/tilt-sample/docker.sock'\nexport KUBECONFIG='/.../.spind/vms/tilt-sample/kubeconfig'\nexport REGISTRY='localhost:61702'\n```\n\nTilt can auto-detect a k3d local registry through the `kube-public/local-registry-hosting` ConfigMap. For that flow, do not set `default_registry()` in the Tiltfile.\n\nA minimal Tiltfile looks like this.\n\n```python\nallow_k8s_contexts(\"spind-tilt-sample\")\n\ndocker_build(\"tilt-sample\", \".\")\n\nk8s_yaml(\"k8s.yaml\")\n\nk8s_resource(\"tilt-sample\", port_forwards=\"8080:80\")\n```\n\nRun Tilt after the spind environment is ready.\n\n```sh\ntilt up\n```\n\nSee `examples/tilt/` for a small Tilt sample.\n\n## Development\n\nUse these commands when working on this repository.\n\n```sh\ntask build\ntask check\ntask test\ntask test:ts\n```\n\nRun end-to-end tests:\n\n```sh\ntask e2e\n```\n\n## Design docs\n\nDetailed design notes are in `docs/design/`.\n\n- `docs/design/minimum-cli.md`\n- `docs/design/project-up.md`\n- `docs/design/docker-host.md`\n- `docs/design/kind-ready-snapshot.md`\n- `docs/design/snapshot.md`\n- `docs/design/roadmap.md`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fappthrust%2Fspind","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fappthrust%2Fspind","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fappthrust%2Fspind/lists"}