{"id":22963855,"url":"https://github.com/exoridus/exojs","last_synced_at":"2026-04-18T20:08:02.389Z","repository":{"id":24164838,"uuid":"100783686","full_name":"Exoridus/ExoJS","owner":"Exoridus","description":"Modern multimedia framework with a focus on performance and extensibility","archived":false,"fork":false,"pushed_at":"2022-02-13T07:26:34.000Z","size":30421,"stargazers_count":0,"open_issues_count":6,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-12T23:35:49.463Z","etag":null,"topics":["javascript","multimedia","webaudio","webaudioapi","webgl","webgl2"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/Exoridus.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}},"created_at":"2017-08-19T09:19:17.000Z","updated_at":"2020-07-17T16:54:55.000Z","dependencies_parsed_at":"2022-07-27T04:32:33.461Z","dependency_job_id":null,"html_url":"https://github.com/Exoridus/ExoJS","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Exoridus%2FExoJS","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Exoridus%2FExoJS/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Exoridus%2FExoJS/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Exoridus%2FExoJS/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Exoridus","download_url":"https://codeload.github.com/Exoridus/ExoJS/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246752603,"owners_count":20827987,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["javascript","multimedia","webaudio","webaudioapi","webgl","webgl2"],"created_at":"2024-12-14T19:40:25.783Z","updated_at":"2026-04-18T20:08:02.377Z","avatar_url":"https://github.com/Exoridus.png","language":"TypeScript","readme":"# ExoJS\n\nExoJS is a TypeScript-first 2D runtime for browser games and interactive apps. It is designed around explicit scene flow, practical rendering features, and predictable runtime behavior.\n\n## Why ExoJS\n\n- TypeScript-first API surface with strong runtime contracts\n- Scene and asset workflows built for real game loops\n- Modern rendering stack: WebGPU-first with WebGL2 fallback\n- Practical visuals: filters, masks, render passes, cache-as-bitmap\n- Gameplay tools: animated sprites, scene stacking, camera helpers, audio sprites\n- Performance visibility with built-in render stats and benchmark harness\n- Optional Rapier physics integration without forcing physics on every app\n\n## What Is Shipped Today\n\n- `Application`, `Scene`, and scene-manager lifecycle\n- Typed `Loader` with manifest/bundle workflow (`defineAssetManifest`, `registerManifest`, `loadBundle`)\n- Drawables: `Sprite`, `AnimatedSprite`, `Graphics`, `ParticleSystem`, `Text`, `Video`\n- Scene stacking (`overlay` / `modal` / `opaque`) with input routing and fade transitions\n- View/camera helpers (`follow`, bounds clamp, shake, zoom)\n- Rendering composition primitives (`RenderTexture`, `RenderTargetPass`, filter chains, masks, cache-as-bitmap)\n- Render stats (`submittedNodes`, `culledNodes`, `drawCalls`, `batches`, `renderPasses`, ...)\n- Optional Rapier adapter (`createRapierPhysicsWorld`)\n\n## Installation\n\n```bash\nnpm install exojs\n```\n\n## Quickstart\n\n```ts\nimport { Application, Scene, Graphics, Color, type SceneRenderRuntime } from 'exojs';\n\nclass HelloScene extends Scene {\n    private readonly box = new Graphics();\n\n    public constructor() {\n        super();\n\n        this.box.fillColor = Color.white;\n        this.box.drawRectangle(-32, -32, 64, 64);\n        this.box.setPosition(400, 300);\n\n        this.addChild(this.box);\n    }\n\n    public override update(delta: import('exojs').Time): void {\n        this.box.rotation += delta.seconds * 45;\n    }\n\n    public override draw(runtime: SceneRenderRuntime): void {\n        this.root.render(runtime);\n    }\n}\n\nconst canvas = document.querySelector('canvas');\n\nif (!canvas) {\n    throw new Error('Missing \u003ccanvas\u003e element.');\n}\n\nconst app = new Application({\n    canvas,\n    width: 800,\n    height: 600,\n    clearColor: Color.cornflowerBlue,\n});\n\nawait app.start(new HelloScene());\n```\n\n## Next Steps\n\n- Documentation hub: [docs/README.md](docs/README.md)\n- Getting started: [docs/getting-started/quickstart.md](docs/getting-started/quickstart.md)\n- Core concepts: [docs/core-concepts/overview.md](docs/core-concepts/overview.md)\n- Assets and bundles: [docs/assets/loader-and-bundles.md](docs/assets/loader-and-bundles.md)\n- Scenes and stack flow: [docs/scenes/scene-flow.md](docs/scenes/scene-flow.md)\n- Rendering and visuals: [docs/rendering/visual-capabilities.md](docs/rendering/visual-capabilities.md)\n- Audio workflow: [docs/audio/audio-workflow.md](docs/audio/audio-workflow.md)\n- Optional physics: [docs/physics/rapier-integration.md](docs/physics/rapier-integration.md)\n- Performance/debugging: [docs/performance/performance-and-debugging.md](docs/performance/performance-and-debugging.md)\n- API reference: [docs/api/README.md](docs/api/README.md)\n- In-repo examples: [examples/README.md](examples/README.md)\n\n## WebGPU and WebGL2\n\n`Application` defaults to backend auto-selection:\n\n- prefers WebGPU when available\n- falls back to WebGL2 if WebGPU is unavailable or initialization fails\n\nYou can force backend selection when needed:\n\n```ts\nnew Application({ backend: { type: 'webgpu' } });\nnew Application({ backend: { type: 'webgl2' } });\nnew Application({ backend: { type: 'auto' } });\n```\n\n## Optional Rapier Physics\n\nRapier integration is opt-in and loaded only when you use it.\n\n```ts\nimport { createRapierPhysicsWorld } from 'exojs';\n\nconst physics = await createRapierPhysicsWorld({ gravityY: 9.81 });\n```\n\nIf Rapier is unavailable, creation fails with a clear setup error.\n\n## Examples\n\nThe runnable live site (Astro + Lit + Monaco preview) lives in [`examples/`](examples/README.md) and is deployed as the repository's GitHub Pages site at \u003chttps://exoridus.github.io/ExoJS/\u003e.\n\n## Development\n\n```bash\nnpm run typecheck\nnpm run lint\nnpm test\nnpm run build\nnpm run verify:package\nnpm run perf:benchmark\n```\n\n## Links\n\n- Repository: \u003chttps://github.com/Exoridus/ExoJS\u003e\n- Issues: \u003chttps://github.com/Exoridus/ExoJS/issues\u003e\n- Changelog: [CHANGELOG.md](CHANGELOG.md)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexoridus%2Fexojs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fexoridus%2Fexojs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexoridus%2Fexojs/lists"}