{"id":38336724,"url":"https://github.com/kjkrol/goke","last_synced_at":"2026-06-08T16:00:33.165Z","repository":{"id":331964775,"uuid":"1131641537","full_name":"kjkrol/goke","owner":"kjkrol","description":"High-performance, zero-allocation ECS for Go. Cache-friendly data orchestrator with type-safe iterators.","archived":false,"fork":false,"pushed_at":"2026-06-07T21:58:32.000Z","size":3374,"stargazers_count":80,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-07T23:22:57.711Z","etag":null,"topics":["ebitengine","ecs","entity-component-system","gamedev","geme-engine","go","goalng","high-performance","simulation"],"latest_commit_sha":null,"homepage":"https://github.com/kjkrol/goke/wiki","language":"Go","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/kjkrol.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"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":"2026-01-10T12:17:49.000Z","updated_at":"2026-06-07T21:54:26.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/kjkrol/goke","commit_stats":null,"previous_names":["kjkrol/goke"],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/kjkrol/goke","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kjkrol%2Fgoke","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kjkrol%2Fgoke/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kjkrol%2Fgoke/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kjkrol%2Fgoke/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kjkrol","download_url":"https://codeload.github.com/kjkrol/goke/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kjkrol%2Fgoke/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34069501,"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-06-08T02:00:07.615Z","response_time":111,"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":["ebitengine","ecs","entity-component-system","gamedev","geme-engine","go","goalng","high-performance","simulation"],"created_at":"2026-01-17T02:56:56.388Z","updated_at":"2026-06-08T16:00:33.158Z","avatar_url":"https://github.com/kjkrol.png","language":"Go","funding_links":[],"categories":["Game Development"],"sub_categories":["Search and Analytic Databases"],"readme":"# GOKe\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\".github/docs/img/logo.png\" alt=\"GOKe Logo\" width=\"300\"\u003e\n  \u003cbr\u003e\n  \u003ca href=\"https://go.dev\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Go-1.23+-00ADD8?style=flat-square\u0026logo=go\" alt=\"Go Version\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://pkg.go.dev/github.com/kjkrol/goke\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/GoDoc-Reference-007d9c?style=flat-square\u0026logo=go\" alt=\"GoDoc\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://opensource.org/licenses/MIT\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square\" alt=\"License\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://goreportcard.com/report/github.com/kjkrol/goke\"\u003e\n    \u003cimg src=\"https://goreportcard.com/badge/github.com/kjkrol/goke\" alt=\"Go Report Card\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://app.codecov.io/gh/kjkrol/goke\"\u003e\n    \u003cimg src=\"https://img.shields.io/codecov/c/github/kjkrol/goke?style=flat-square\u0026logo=codecov\" alt=\"Codecov Coverage\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/kjkrol/goke/actions\"\u003e\n    \u003cimg src=\"https://github.com/kjkrol/goke/actions/workflows/go.yml/badge.svg\" alt=\"Go Quality Check\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/avelino/awesome-go\"\u003e\n    \u003cimg src=\"https://awesome.re/mentioned-badge-flat.svg\" alt=\"Mentioned in Awesome Go\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n**GOKe** is an ultra-lightweight, high-performance, and type-safe **SoA (Structure of Arrays)** [Entity Component System](https://en.wikipedia.org/wiki/Entity_component_system) (aka ECS) for [Go](https://go.dev/). It is engineered for maximum data throughput, leveraging modern **Go 1.23+ Iterators** and a Data-Oriented Design (DOD) architecture.\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e \n  \u0026nbsp;\u0026bull;\u0026nbsp; \n  \u003ca href=\"#usage\"\u003eUsage\u003c/a\u003e\n  \u0026nbsp;\u0026bull;\u0026nbsp; \n  \u003ca href=\"#architecture\"\u003eArchitecture\u003c/a\u003e\n  \u0026nbsp;\u0026bull;\u0026nbsp; \n  \u003ca href=\"#performance\"\u003ePerformance\u003c/a\u003e\n  \u0026nbsp;\u0026bull;\u0026nbsp; \n  \u003ca href=\"#features\"\u003eFeatures\u003c/a\u003e\n  \u0026nbsp;\u0026bull;\u0026nbsp;\n  \u003ca href=\"#roadmap\"\u003eRoadmap\u003c/a\u003e\n  \u0026nbsp;\u0026bull;\u0026nbsp; \n  \u003ca href=\"BENCHMARKS.md\"\u003eBenchmarks\u003c/a\u003e\n  \u0026nbsp;\u0026bull;\u0026nbsp; \n  \u003ca href=\"#documentation\"\u003eDocumentation\u003c/a\u003e\n\u003c/p\u003e\n\n# 🚀 Use Cases: Why GOKe?\n\nGOKe is primarily a **high-performance ECS for game development**, designed to manage massive entity counts while keeping the Go Garbage Collector (GC) completely silent. However, its core architecture a **data-oriented orchestrator** — makes it suitable for any scenario requiring cache-friendly iteration over millions of objects.\n\n## 🎮 Gaming (Ebitengine \u0026 Frameworks)\n\nGOKe is the perfect companion for **Ebitengine** or purely server-side game loops. Managing thousands of active objects (bullets, particles, NPCs) often hits CPU bottlenecks due to pointer chasing and GC pressure. GOKe solves this via:\n\n* **Zero-Alloc Updates**: Update thousands of entities in a single tick without triggering the GC.\n* **Decoupled Logic**: Keep your rendering logic in Ebitengine and your game state in GOKe's optimized archetypes, utilizing structures like **[Bucket Grid](https://github.com/kjkrol/gokg)**.\n* **Deterministic Physics**: Run complex collision detection systems across all entities using `RunParallel`.\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth style=\"text-align: left; vertical-align: top; width: 400px;\"\u003e\n        \u003cvideo src=\"https://github.com/user-attachments/assets/fa8d1aca-2060-466d-8204-9d6a7443d580\" width=\"400\" autoplay loop muted playsinline\u003e\u003c/video\u003e\n        \u003cbr\u003e\n          \u003csub\u003e\u003cstrong\u003eStats:\u003c/strong\u003e 2048 colliding AABBs | 120 TPS | 0.1-1 collisions/tick\u003c/sub\u003e\n      \u003c/th\u003e\n      \u003cth style=\"text-align: left; vertical-align: top; width: 400px;\"\u003e\n        \u003cvideo src=\"https://github.com/user-attachments/assets/f1ef2c0b-fb7b-478a-bc88-77faa48c0623\" width=\"400\" autoplay loop muted playsinline\u003e\u003c/video\u003e\n        \u003cbr\u003e\n        \u003csub\u003e\u003cstrong\u003eStats:\u003c/strong\u003e 64 colliding AABBs | 120 TPS | 0.1-1 collisions/tick\u003c/sub\u003e\n      \u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n\u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd colspan=\"2\" align=\"center\"\u003e\n        \u003csub\u003e\n          \u003cstrong\u003eCheck out the \u003ca href=\"examples/ebiten-demo/main.go\"\u003efull source code\u003c/a\u003e\u003c/strong\u003e\n        \u003c/sub\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n## 🧬 Simulations \u0026 High-Throughput Data\nBeyond gaming, GOKe shines in any domain where latency consistency is critical and object counts are in the millions.\n\n* **Agent-Based Simulations**: Crowd dynamics, epidemiological models, or particle physics where $O(N)$ iteration speed is the bottleneck.\n* **Real-time Telemetry**: Processing high-frequency data streams (e.g., IoT sensor fusion) where predictable memory access patterns prevent latency spikes.\n* **Heavy Compute Pipelines**: Logic that requires transforming large datasets every frame (e.g., 16ms window) without allocation overhead.\n\n## ⚖️ When NOT to use GOKe\nTo ensure GOKe is the right tool for your project, consider these trade-offs:\n* **Small Data Sets:** If you only manage a few hundred objects, a simple slice of structs will be easier to maintain and fast enough.\n* **Deep Hierarchies:** ECS is designed for flat, high-speed iteration. If your data is naturally a deep tree (like a UI DOM), a classic tree structure might be more intuitive.\n* **High Structural Churn:** If you are adding/removing components from thousands of entities *every single frame*, the overhead of archetype migration might offset the iteration gains.\n\n\u003ca id=\"installation\"\u003e\u003c/a\u003e\n# 📦 Installation\n\nGOKe requires **Go 1.23** or newer.\n\n```bash\ngo get github.com/kjkrol/goke\n```\n\n\u003ca id=\"features\"\u003e\u003c/a\u003e\n# ✨ Key Features\n\nCore capabilities designed for predictable performance, cache locality, and zero-allocation cycles:\n\n* **Type-Safe Generics**: Views (`NewView1[A]` ... `NewView10`) use Go generics to eliminate interface overhead, boxing, and runtime type assertions in the hot loop.\n* **Go 1.23+ Range Iterators**: Uses native `iter.Seq` for standard `for range` loops. This allows the compiler to inline iteration logic directly, avoiding callback overhead.\n* **Deferred Mutations**: Structural changes (Create/Remove/Add components) are buffered via a **Command Buffer** and applied at synchronization points to ensure thread safety without heavy locking.\n* **Parallel Execution**: `RunParallel` distributes system execution across available CPU cores with deterministic synchronization, scaling linearly with hardware resources.\n* **Zero-Alloc Hot Loop**: The architecture guarantees zero heap allocations during the update cycle (tick), preventing GC pauses during simulation.\n* **Entity Blueprints**: Fast, template-based instantiation. Allows creating thousands of entities with identical component layouts using optimal memory copy operations.\n\n\u003e 💡 **See it in action**: Check the `cmd` directory for the concurrent dice game simulation demonstrating parallel systems and state management.\n\n## ⚠️ Limitations\n\n* **Maximum component types: 128 by default.** Defined by `MaxComponents` in [`internal/core/archetype_mask.go`](./internal/core/archetype_mask.go). The archetype mask is a fixed-size bitset (`[MaskSize]uint64`\nwith `MaskSize = 2`) for branch-free intersection checks. Raising this limit requires recompiling GOKe with edited constants (`MaskSize` and `MaxComponents`); it is **not** a runtime configuration.\n\n\u003ca id=\"usage\"\u003e\u003c/a\u003e\n# 💻 Usage Example\n\u003e 📘 **New to ECS?** Check out the [**Getting Started with GOKe**](https://github.com/kjkrol/goke/wiki/Getting-Started-with-GOKe) guide for a step-by-step deep dive into building your first simulation.\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/kjkrol/goke\"\n)\n\ntype Pos struct{ X, Y float32 }\ntype Vel struct{ X, Y float32 }\ntype Acc struct{ X, Y float32 }\n\nfunc main() {\n\t// Initialize the ECS world.\n\t// The ECS instance acts as the central coordinator for entities and systems.\n\tecs := goke.New()\n\n\t// Define component metadata.\n\t// This binds Go types to internal descriptors, allowing the engine to\n\t// pre-calculate memory layouts and manage data in contiguous arrays.\n\tposDesc := goke.RegisterComponent[Pos](ecs)\n\t_ = goke.RegisterComponent[Vel](ecs)\n\t_ = goke.RegisterComponent[Acc](ecs)\n\n\t// --- Type-Safe Entity Template (Blueprint) ---\n\t// Blueprints place entities into the correct archetype immediately and\n\t// reserve memory for all components in a single batch operation.\n\t// Each yielded page exposes typed slices for direct, in-place initialization.\n\tblueprint := goke.NewBlueprint3[Pos, Vel, Acc](ecs)\n\n\tvar entity goke.Entity\n\tfor page := range blueprint.Create(1) {\n\t\tentity = page.Entity[0]\n\t\tpage.Comp1[0] = Pos{X: 0, Y: 0}\n\t\tpage.Comp2[0] = Vel{X: 1, Y: 1}\n\t\tpage.Comp3[0] = Acc{X: 0.1, Y: 0.1}\n\t}\n\n\t// Initialize view for Pos, Vel, and Acc components\n\tview := goke.NewView3[Pos, Vel, Acc](ecs)\n\n\t// Define the movement system using the functional registration pattern\n\tmovementSystem := goke.RegisterSystemFunc(ecs, func(schedule *goke.Schedule, d time.Duration) {\n\t\t// SoA (Structure of Arrays) layout ensures CPU cache friendliness.\n\t\t// View.All yields page-shaped slices over native memory — the inner\n\t\t// loop is on the caller side for aggressive compiler inlining.\n\t\tfor page := range view.All() {\n\t\t\tfor i := range page.Entity {\n\t\t\t\tpos, vel, acc := \u0026page.Comp1[i], \u0026page.Comp2[i], \u0026page.Comp3[i]\n\n\t\t\t\tvel.X += acc.X\n\t\t\t\tvel.Y += acc.Y\n\t\t\t\tpos.X += vel.X\n\t\t\t\tpos.Y += vel.Y\n\t\t\t}\n\t\t}\n\t})\n\n\t// Configure the ECS's execution workflow and synchronization points\n\tgoke.Plan(ecs, func(ctx goke.ExecutionContext, d time.Duration) {\n\t\tctx.Run(movementSystem, d)\n\t\tctx.Sync() // Ensure all component updates are flushed and views are consistent\n\t})\n\n\t// Execute a single simulation step (standard 120 TPS)\n\tgoke.Tick(ecs, time.Second/120)\n\n\tp := goke.GetComponent[Pos](ecs, entity, posDesc)\n\tfmt.Printf(\"Final Position: {X: %.2f, Y: %.2f}\\n\", p.X, p.Y)\n}\n```\n\n### Explore Examples\nCheck the [**examples/**](./examples) directory for complete, ready-to-run projects.\n\n\u003e ⚠️ **IMPORTANT**:\n\u003e **Setup Required**: To keep the core ECS engine lightweight and free of GUI dependencies, examples are managed as isolated modules. Before running them, you must initialize the workspace:\n\u003e ```bash\n\u003e make setup\n\u003e ```\n\n* [**Mini Demo**](./examples/mini-demo/main.go) – The minimalist starter.\n* [**Simple Demo**](./examples/simple-demo/main.go) – A slightly more advanced introduction to the ECS lifecycle.\n* [**Parallel Demo**](./examples/parallel-demo/main.go) – **Advanced showcase**:\n  * Coordination of multiple systems.\n  * Concurrent execution using `RunParallel`.\n  * Handling structural changes via **Command Buffer** and explicit **Sync points**.\n* [**Ebiten Demo**](./examples/ebiten-demo/main.go) – **Graphics Integration \u0026 Spatial Physics**:\n  * Real-time rendering using [Ebitengine](https://github.com/kjkrol/gokg).\n  * High-performance spatial management using [GOKg](https://github.com/kjkrol/gokg).\n  * Custom physics pipeline: **Velocity Inversion** is processed strictly before **Position Compensation** to ensure boundary stability.\n  * **Note**: Run `make` inside the example directory to fetch dependencies and start the demo.\n\n\u003ca id=\"architecture\"\u003e\u003c/a\u003e\n# 🏗️ Core Architecture \u0026 \"Mechanical Sympathy\"\n\nGOKe is an archetype-based ECS designed for deterministic performance. It shifts structural overhead (like offset calculations) to the initialization phase and uses a chunked SoA layout to maintain consistent throughput regardless of scale.\n\n## Data-Oriented Memory Design\nThe storage layer is engineered to maximize cache hits and eliminate allocation spikes (\"GC jitter\").\n\n* **Chunked SoA (Structure of Arrays)**: Instead of monolithic slices that require costly resizing (copying millions of elements) when capacity is exceeded, GOKe manages data in **fixed-size Memory Pages** (aligned to L1 Cache, e.g., 96KB).\n    * **Stable Growth**: Memory allocation is linear and \"stepless\". Adding the 1,000,001st entity simply allocates one small memory chunk, avoiding the massive latency spike of doubling a large array.\n    * **Cache Locality**: Inside each chunk, components are packed in a tight SoA layout (`[IDs...][CompA...][CompB...]`), ensuring high-efficiency hardware prefetching.\n* **Generation-based Recycling**: Entities are tracked via 64-bit IDs (32-bit Index / 32-bit Generation). This prevents **entity aliasing**—stale references to destroyed entities are instantly recognized as invalid when their memory slot is reused.\n* **Archetype Masks**: Supports rapid composition checks using fast, constant-time bitwise operations. This allows for complex queries over component types without iterating over unrelated data.\n\n## High-Throughput Access \u0026 Iteration\nGOKe bypasses traditional bottlenecks like reflection and map lookups in the execution phase.\n\n* **Flat Cache View**: Views pre-calculate direct pointers to component columns within active chunks. This **eliminates map lookups** and pointer chasing inside the hot loop.\n* **Zero-Overhead Iteration**: Powered by native `for range` over functions (`iter.Seq`), allowing the Go compiler to perform aggressive loop inlining directly over the memory pages.\n* **Deterministic $O(1)$ Filter**: Querying specific entities via the **Centralized Record System** takes constant time regardless of the total entity count ($N$) by mapping IDs directly to `(ChunkIndex, RowIndex)` coordinates.\n* **Hardware Prefetching Optimization**: View structures are optimized to keep the prefetcher strictly focused on the data stream, minimizing cache pollution during iteration.\n\n\n## Execution Planning \u0026 Consistency\n* **Deferred Commands**: State consistency is maintained via `Commands`. Structural changes (add/remove) are buffered and applied during explicit `Sync()` points to ensure memory safety and cache integrity.\n* **Thread-Safe Concurrency**: Native support for `RunParallel` execution. GOKe provides the infrastructure for multi-core scaling, assuming the developer ensures disjoint component sets to avoid race conditions.\n\n\u003ca id=\"performance\"\u003e\u003c/a\u003e\n# ⏱️ Performance \u0026 Scalability\n\u003e The engine is engineered for extreme scalability and deterministic performance. By utilizing a **Centralized Record System** (dense array lookup) instead of traditional hash maps, we have effectively decoupled both structural changes and query performance from the total entity count ($N$).\n\nGOKe delivers near-metal speeds by eliminating heap allocations and leveraging L1/L2 cache locality.\n\n| Category | Operation | Performance (1024 Baseline) | Allocs | Technical Mechanism |\n| :--- | :--- | :--- | :--- | :--- |\n| **Throughput** | **Iteration (View.All)** | **0.35 - 2.06 ns/ent** | **0** | Linear SoA (0-10 components) |\n| **Subset Query** | **Filter (per-entity)** | **3.20 - 11.33 ns/ent** | **0** | Per-entity record lookup + pointer math |\n| **Structural** | **Batch Create (1024 ent.)** | **8 - 20 ns/ent** | 4 | Blueprint-based pages |\n| **Structural** | **Migrate Component** | **36.08 ns/op** | **0** | Archetype Move (Insert) |\n| **Structural** | **Add Tag** | **33.96 ns/op** | **0** | Archetype Move (Metadata) |\n| **Structural** | **Remove Component** | **7.58 ns/op** | **0** | Swap-and-pop |\n| **Structural** | **Remove Entity** | **2.83 ns/op** | **0** | Index Recycling |\n| **Access** | **Get Component** | **4.67 ns/op** | **0** | Inlined Record Lookup |\n\n\u003e 📊 **Deep Dive**: For a full breakdown of hardware specs, stress tests, and $O(N)$ vs $O(1)$ scaling charts, see [**BENCHMARKS.md**](./BENCHMARKS.md).\n\n\u003e 🔬 **Cross-framework comparison**: Benchmarks against other Go ECS libraries (Arche, Donburi, Ento, etc.) are maintained in a dedicated project — [**go-ecs-benchmarks**](https://github.com/mlange-42/go-ecs-benchmarks) by [@mlange-42](https://github.com/mlange-42). ⚠️ Before drawing conclusions, verify which GOKe version (tag) is used in the comparison — published results may lag behind the main branch.\n\n### Reproducing Results\nRun the suite on your own hardware:\n```bash\ngo test -bench=. ./... -benchmem\n```\n\n\u003ca id=\"roadmap\"\u003e\u003c/a\u003e\n# 🗺️ Roadmap\nCurrent development focus and planned improvements:\n\n* **Ebitengine Integration:** Dedicated helpers for seamless state synchronization between GOKe systems and Ebitengine's loop — partially prototyped in the [ebiten-demo](./examples/ebiten-demo/main.go), with the goal of extracting it into a separate companion repository.\n* **Entity Relations via Tags:** Extend the Tag system to model relationships between entities (parent-child, links, ownership, ...) — adding relational semantics on top of the existing archetype-mask machinery, without sacrificing the zero-allocation hot loop.\n\n\u003e 🛠️ **Live Feature Tracker**\n\u003e We manage our long-term goals through GitHub Issues. View all planned core engine expansions and functional capabilities here:\n\u003e [**Explore all Pending Features ↗**](https://github.com/kjkrol/goke/issues?q=state%3Aopen%20label%3Afeature)\n\n# License\n\nGOKe is licensed under the MIT License. See the LICENSE [file](./LICENSE) for more details.\n\n\u003ca id=\"documentation\"\u003e\u003c/a\u003e\n# 📖 Documentation\n* **API Reference**: Detailed documentation and examples are available on [**pkg.go.dev**](https://pkg.go.dev/github.com/kjkrol/goke).\n* **Wiki \u0026 Guides**: For a step-by-step deep dive into building your first simulation, check the [**Getting Started with GOKe**](https://github.com/kjkrol/goke/wiki/Getting-Started-with-GOKe) guide.\n* **Internal Mechanics**: For a technical breakdown of the engine's core, check the `doc.go` files within the `ecs` packages.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkjkrol%2Fgoke","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkjkrol%2Fgoke","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkjkrol%2Fgoke/lists"}