{"id":46714007,"url":"https://github.com/tuanchris/dune-weaver","last_synced_at":"2026-03-09T10:01:29.970Z","repository":{"id":265168148,"uuid":"895337152","full_name":"tuanchris/dune-weaver","owner":"tuanchris","description":"An open-source kinetic sand art table that creates mesmerizing patterns using a ball controlled by precision motors.","archived":false,"fork":false,"pushed_at":"2026-03-05T14:48:59.000Z","size":130198,"stargazers_count":290,"open_issues_count":4,"forks_count":79,"subscribers_count":15,"default_branch":"main","last_synced_at":"2026-03-05T17:32:29.989Z","etag":null,"topics":["art","cnc","kinetic-sand-art","motors","patterns"],"latest_commit_sha":null,"homepage":"https://duneweaver.com","language":"Python","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/tuanchris.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","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":"2024-11-28T02:42:22.000Z","updated_at":"2026-03-03T14:41:21.000Z","dependencies_parsed_at":"2024-12-09T21:21:33.487Z","dependency_job_id":"06ec47a4-4957-4867-a16e-90c02827c72f","html_url":"https://github.com/tuanchris/dune-weaver","commit_stats":null,"previous_names":["tuanchris/3d-printed-sand-table","tuanchris/dune-weaver"],"tags_count":49,"template":false,"template_full_name":null,"purl":"pkg:github/tuanchris/dune-weaver","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuanchris%2Fdune-weaver","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuanchris%2Fdune-weaver/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuanchris%2Fdune-weaver/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuanchris%2Fdune-weaver/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tuanchris","download_url":"https://codeload.github.com/tuanchris/dune-weaver/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuanchris%2Fdune-weaver/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30290898,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-09T02:57:19.223Z","status":"ssl_error","status_checked_at":"2026-03-09T02:56:26.373Z","response_time":61,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["art","cnc","kinetic-sand-art","motors","patterns"],"created_at":"2026-03-09T10:01:29.382Z","updated_at":"2026-03-09T10:01:29.965Z","avatar_url":"https://github.com/tuanchris.png","language":"Python","funding_links":["https://www.patreon.com/cw/DuneWeaver"],"categories":[],"sub_categories":[],"readme":"# Dune Weaver\n\n[![Patreon](https://img.shields.io/badge/Patreon-F96854?style=for-the-badge\u0026logo=patreon\u0026logoColor=white)](https://www.patreon.com/cw/DuneWeaver)\n\n![Dune Weaver](./static/og-image.jpg)\n\n**An open-source kinetic sand art table that creates mesmerizing patterns using a ball controlled by precision motors.**\n\n## Features\n\n- **Modern React UI** — A responsive, touch-friendly web interface that installs as a PWA on any device\n- **Pattern Library** — Browse, upload, and manage hundreds of sand patterns with auto-generated previews\n- **Live Preview** — Watch your pattern come to life in real time with progress tracking\n- **Playlists** — Queue up multiple patterns with configurable pause times and automatic clearing between drawings\n- **LED Integration** — Synchronized lighting via native DW LEDs or WLED, with separate idle, playing, and scheduled modes\n- **Still Sands Scheduling** — Set quiet hours so the table pauses automatically on your schedule\n- **Multi-Table Support** — Control several sand tables from a single interface\n- **Home Assistant Integration** — Connect to Home Assistant or other home automation systems using MQTT\n- **Auto-Updates** — One-click software updates right from the settings page\n- **Add-Ons** — Optional [Desert Compass](https://duneweaver.com/docs) for auto-homing and [DW Touch](https://duneweaver.com/docs) for dedicated touchscreen control\n\n## How It Works\n\nThe system is split across two devices connected via USB:\n\n```\n┌─────────────────┐         USB          ┌─────────────────┐\n│  Raspberry Pi   │ ◄──────────────────► │  DLC32 / ESP32  │\n│  (Dune Weaver   │                      │  (FluidNC)      │\n│   Backend)      │                      │                 │\n└─────────────────┘                      └─────────────────┘\n        │                                        │\n        │ Wi-Fi                                  │ Motor signals\n        ▼                                        ▼\n   Web Browser                            Stepper Motors\n   (Control UI)                           (Theta \u0026 Rho)\n```\n\nThe **Raspberry Pi** runs the web UI, manages pattern files and playlists, and converts patterns into G-code. The **DLC32/ESP32** running [FluidNC](https://github.com/bdring/FluidNC) firmware receives that G-code and drives the stepper motors in real time.\n\n## Hardware\n\nDune Weaver comes in three premium models:\n\n| | [DW Pro](https://duneweaver.com/products/dwp) | [DW Mini Pro](https://duneweaver.com/products/dwmp) | [DW Gold](https://duneweaver.com/products/dwg) |\n|---|---|---|---|\n| **Size** | 75 cm (29.5\") | 25 cm (10\") | 45 cm (17\") |\n| **Enclosure** | IKEA VITTSJÖ table | IKEA BLANDA bowl | IKEA TORSJÖ side table |\n| **Motors** | 2 × NEMA 17 | 2 × NEMA 17 | 2 × NEMA 17 |\n| **Controller** | DLC32 | DLC32 | DLC32 |\n| **Best for** | Living rooms | Desktops | Side-table accent piece |\n\nAll models run the same software with [FluidNC](https://github.com/bdring/FluidNC) firmware — only the mechanical parts differ.\n\nFree 3D-printable models on MakerWorld: [DW OG](https://makerworld.com/en/models/841332-dune-weaver-a-3d-printed-kinetic-sand-table#profileId-787553) · [DW Mini](https://makerworld.com/en/models/896314-mini-dune-weaver-not-your-typical-marble-run#profileId-854412)\n\n\u003e **Build guides, BOMs, and wiring diagrams** are in the [Dune Weaver Docs](https://duneweaver.com/docs).\n\n## Quick Start\n\nThe fastest way to get running on a Raspberry Pi:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/tuanchris/dune-weaver/main/setup-pi.sh | bash\n```\n\nThis installs Docker, clones the repo, and starts the application. Once it finishes, open **http://\\\u003chostname\\\u003e.local** in your browser.\n\nFor full deployment options (Docker, manual install, development setup, Windows, and more), see the **[Deploying Backend](https://duneweaver.com/docs/deploying-backend)** guide.\n\n### Polar coordinates\n\nThe sand table uses **polar coordinates** instead of the typical X-Y grid:\n\n- **Theta (θ)** — the angle in radians (2π = one full revolution)\n- **Rho (ρ)** — the distance from the center (0.0 = center, 1.0 = edge)\n\nPatterns are stored as `.thr` text files — one coordinate pair per line:\n\n```\n# A simple four-point star\n0.000 0.5\n1.571 0.7\n3.142 0.5\n4.712 0.7\n```\n\nThe same pattern file works on any table size thanks to the normalized coordinate system. You can create patterns by hand, generate them with code, or browse the built-in library.\n\n## Documentation\n\nFull setup instructions, hardware assembly, firmware flashing, and advanced configuration:\n\n**[Dune Weaver Docs](https://duneweaver.com/docs)**\n\n## Contributing\n\nWe welcome contributions! See the [Contributing Guide](CONTRIBUTING.md) for how to get started.\n\n---\n\n**Happy sand drawing!**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftuanchris%2Fdune-weaver","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftuanchris%2Fdune-weaver","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftuanchris%2Fdune-weaver/lists"}