{"id":41293776,"url":"https://github.com/ChartGPU/ChartGPU","last_synced_at":"2026-02-01T14:00:51.436Z","repository":{"id":333701901,"uuid":"1136039994","full_name":"ChartGPU/ChartGPU","owner":"ChartGPU","description":"Beautiful, open source, WebGPU-based charting library","archived":false,"fork":false,"pushed_at":"2026-02-01T07:17:32.000Z","size":9565,"stargazers_count":2405,"open_issues_count":1,"forks_count":59,"subscribers_count":9,"default_branch":"main","last_synced_at":"2026-02-01T09:21:14.980Z","etag":null,"topics":["candlestick-chart","chart","chart-library","charting","charting-library","data-analysis","data-analytics","data-visualization","data-visualization-tools","data-viz","gpu","npm","npm-package","react","react-chart-library","typescript-library","webgl","webgpu","webgpu-shaders"],"latest_commit_sha":null,"homepage":"https://chartgpu.github.io/ChartGPU/","language":"TypeScript","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/ChartGPU.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.md","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-17T00:52:00.000Z","updated_at":"2026-02-01T08:43:33.000Z","dependencies_parsed_at":"2026-01-23T19:01:36.242Z","dependency_job_id":null,"html_url":"https://github.com/ChartGPU/ChartGPU","commit_stats":null,"previous_names":["chartgpu/chartgpu"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/ChartGPU/ChartGPU","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChartGPU%2FChartGPU","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChartGPU%2FChartGPU/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChartGPU%2FChartGPU/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChartGPU%2FChartGPU/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ChartGPU","download_url":"https://codeload.github.com/ChartGPU/ChartGPU/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChartGPU%2FChartGPU/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28980159,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-01T13:38:33.235Z","status":"ssl_error","status_checked_at":"2026-02-01T13:38:32.912Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":["candlestick-chart","chart","chart-library","charting","charting-library","data-analysis","data-analytics","data-visualization","data-visualization-tools","data-viz","gpu","npm","npm-package","react","react-chart-library","typescript-library","webgl","webgpu","webgpu-shaders"],"created_at":"2026-01-23T04:00:28.131Z","updated_at":"2026-02-01T14:00:51.429Z","avatar_url":"https://github.com/ChartGPU.png","language":"TypeScript","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/assets/chart-gpu.jpg\" alt=\"ChartGPU\" width=\"400\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  High-performance charts powered by WebGPU\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/hunterg325/ChartGPU/blob/main/docs/GETTING_STARTED.md\"\u003eDocumentation\u003c/a\u003e |\n  \u003ca href=\"https://chartgpu.github.io/ChartGPU/\"\u003eLive Demo\u003c/a\u003e |\n  \u003ca href=\"https://github.com/hunterg325/ChartGPU/tree/main/examples\"\u003eExamples\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.npmjs.com/package/chartgpu\" style=\"text-decoration: none;\"\u003e\n    \u003cimg src=\"https://img.shields.io/npm/v/chartgpu\" alt=\"npm\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/hunterg325/ChartGPU/blob/main/LICENSE\" style=\"text-decoration: none;\"\u003e\n    \u003cimg src=\"https://img.shields.io/npm/l/chartgpu\" alt=\"license\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://chartgpu.github.io/ChartGPU/\" style=\"text-decoration: none;\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/demo-live-brightgreen\" alt=\"Live Demo\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\nChartGPU is a TypeScript charting library built on WebGPU for smooth, interactive rendering—especially when you have lots of data.\n\n## Highlights\n\n- 🚀 WebGPU-accelerated rendering for high FPS with large datasets\n- ⚡ Worker-based rendering with OffscreenCanvas (optional - for maximum performance)\n- 📈 Multiple series types: line, area, bar, scatter, pie, candlestick\n- 🌡️ Scatter density/heatmap mode (`mode: 'density'`) for large point clouds — see [`docs/api/options.md#scatterseriesconfig`](docs/api/options.md#scatterseriesconfig) and [`examples/scatter-density-1m/`](examples/scatter-density-1m/)\n- 🧭 Built-in interaction: hover highlight, tooltip, crosshair\n- 🔁 Streaming updates via `appendData(...)` (cartesian series)\n- 🔍 X-axis zoom (inside gestures + optional slider UI)\n- 🎛️ Theme presets (`'dark' | 'light'`) and custom theme support\n\n## Architecture\n\nAt a high level, `ChartGPU.create(...)` owns the canvas + WebGPU lifecycle, and delegates render orchestration (layout/scales/data upload/render passes + internal overlays) to the render coordinator. For deeper internal notes, see [`docs/api/INTERNALS.md`](https://github.com/hunterg325/ChartGPU/blob/main/docs/api/INTERNALS.md) (especially “Render coordinator”).\n\n```mermaid\nflowchart TB\n  UserApp[\"Consumer app\"] --\u003e PublicAPI[\"src/index.ts (Public API exports)\"]\n\n  PublicAPI --\u003e ChartCreate[\"ChartGPU.create(container, options)\"]\n  PublicAPI --\u003e SyncAPI[\"connectCharts(charts)\"]\n\n  subgraph MainThread[\"🔷 MAIN THREAD RENDERING (Default)\"]\n    subgraph ChartInstance[\"Chart instance (src/ChartGPU.ts)\"]\n      ChartCreate --\u003e SupportCheck[\"checkWebGPUSupport()\"]\n      ChartCreate --\u003e Canvas[\"Create canvas + mount into container\"]\n      ChartCreate --\u003e Options[\"resolveOptionsForChart(options)\u003cbr/\u003e(adds bottom reserve when slider present)\"]\n      ChartCreate --\u003e GPUInit[\"GPUContext.create(canvas)\"]\n      ChartCreate --\u003e Coordinator[\"createRenderCoordinator(gpuContext, resolvedOptions)\"]\n\n      ChartCreate --\u003e InstanceAPI[\"ChartGPUInstance APIs\"]\n      InstanceAPI --\u003e RequestRender[\"requestAnimationFrame (coalesced)\"]\n      RequestRender --\u003e Coordinator\n\n      InstanceAPI --\u003e SetOption[\"setOption(...)\"]\n      InstanceAPI --\u003e AppendData[\"appendData(...)\"]\n      InstanceAPI --\u003e Resize[\"resize()\"]\n\n      subgraph PublicEvents[\"Public events + hit-testing (ChartGPU.ts)\"]\n        Canvas --\u003e PointerHandlers[\"Pointer listeners\"]\n        PointerHandlers --\u003e PublicHitTest[\"findNearestPoint() / findPieSlice()\"]\n        PointerHandlers --\u003e EmitEvents[\"emit('click'/'mouseover'/'mouseout')\"]\n      end\n\n      DataZoomSlider[\"dataZoom slider (absolute-positioned DOM overlay)\u003cbr/\u003echart reserves bottom space for x-axis\"] --\u003e Coordinator\n    end\n\n    subgraph WebGPUCore[\"WebGPU core (src/core/GPUContext.ts)\"]\n      GPUInit --\u003e AdapterDevice[\"navigator.gpu.requestAdapter/device\"]\n      GPUInit --\u003e CanvasConfig[\"canvasContext.configure(format)\"]\n    end\n\n    subgraph RenderCoordinatorLayer[\"Render coordinator (src/core/createRenderCoordinator.ts)\"]\n      Coordinator --\u003e Layout[\"GridArea layout\"]\n      Coordinator --\u003e Scales[\"xScale/yScale (clip space for render)\"]\n      Coordinator --\u003e DataUpload[\"createDataStore(device) (GPU buffer upload/caching)\"]\n      Coordinator --\u003e DensityCompute[\"Encode + submit compute pass\u003cbr/\u003e(scatter density mode)\"]\n      DensityCompute --\u003e RenderPass[\"Encode + submit render pass\"]\n\n      subgraph InternalOverlays[\"Internal interaction overlays (coordinator)\"]\n        Coordinator --\u003e Events[\"createEventManager(canvas, gridArea)\"]\n        Events --\u003e OverlayHitTest[\"hover/tooltip hit-testing\"]\n        Events --\u003e InteractionX[\"interaction-x state (crosshair)\"]\n        Coordinator --\u003e OverlaysDOM[\"DOM overlays: legend / tooltip / text labels\"]\n      end\n    end\n  end\n\n  subgraph WorkerThread[\"⚡ WORKER THREAD RENDERING (Optional - src/worker/)\"]\n    subgraph WorkerProxyAPI[\"Worker Proxy API (src/worker/)\"]\n      CreateInWorker[\"createChartInWorker(container, options)\u003cbr/\u003eChartGPU.createInWorker(container, options)\"]\n      CreateInWorker --\u003e ProxyInit[\"ChartGPUWorkerProxy initialization\"]\n      ProxyInit --\u003e CanvasTransfer[\"canvas.transferControlToOffscreen()\"]\n      ProxyInit --\u003e WorkerCreate[\"Create Worker (built-in or custom)\"]\n    end\n\n    subgraph MainThreadProxy[\"Main Thread: ChartGPUWorkerProxy (src/worker/ChartGPUWorkerProxy.ts)\"]\n      ProxyInit --\u003e ProxyInstance[\"ChartGPUWorkerProxy implements ChartGPUInstance\"]\n      ProxyInstance --\u003e ProxyState[\"Local state cache\u003cbr/\u003e(options, interactionX, zoomRange)\"]\n      ProxyInstance --\u003e EventForwarding[\"Event forwarding to worker\u003cbr/\u003e(pointerdown/move/up/leave/wheel)\"]\n      ProxyInstance --\u003e ProxyOverlays[\"DOM overlay management\u003cbr/\u003e(tooltip, legend, text, slider)\"]\n      ProxyInstance --\u003e ResizeMonitoring[\"ResizeObserver + DPR monitoring\u003cbr/\u003e(RAF batched)\"]\n      \n      EventForwarding --\u003e ForwardPointer[\"computePointerEventData()\u003cbr/\u003e(calculates grid coords on main thread)\"]\n      ResizeMonitoring --\u003e ResizeRAF[\"RAF-batched resize messages\"]\n    end\n\n    subgraph WorkerInbound[\"Main → Worker (src/worker/protocol.ts)\"]\n      CanvasTransfer --\u003e|\"postMessage: init\"| WorkerInit[\"InitMessage + OffscreenCanvas transfer\u003cbr/\u003e(includes devicePixelRatio from main thread)\"]\n      ProxyInstance --\u003e|\"postMessage: setOption\"| WorkerSetOpt[\"SetOptionMessage\"]\n      ProxyInstance --\u003e|\"postMessage: appendData\"| WorkerAppend[\"AppendDataMessage + ArrayBuffer transfer\"]\n      ResizeRAF --\u003e|\"postMessage: resize\"| WorkerResize[\"ResizeMessage\u003cbr/\u003e(includes devicePixelRatio)\"]\n      ForwardPointer --\u003e|\"postMessage: forwardPointerEvent\"| WorkerPointer[\"ForwardPointerEventMessage\u003cbr/\u003e(includes pre-computed grid coordinates)\"]\n      ProxyInstance --\u003e|\"postMessage: setZoomRange\"| WorkerZoom[\"SetZoomRangeMessage\"]\n      ProxyInstance --\u003e|\"postMessage: setInteractionX\"| WorkerInteractionX[\"SetInteractionXMessage\"]\n      ProxyInstance --\u003e|\"postMessage: dispose\"| WorkerDispose[\"DisposeMessage\"]\n    end\n\n    subgraph WorkerCore[\"Worker Thread: ChartGPUWorkerController (src/worker/ChartGPUWorkerController.ts)\"]\n      WorkerInit --\u003e WGPUInit[\"GPUContext.create(offscreenCanvas)\"]\n      WGPUInit --\u003e WOptions[\"resolveOptionsForChart(msg.options)\u003cbr/\u003e(adds bottom reserve when slider present)\"]\n      WOptions --\u003e WCoordinator[\"createRenderCoordinator(gpuContext, resolvedOptions)\u003cbr/\u003ecomputeInteractionScalesGridCssPx\u003cbr/\u003e(supports OffscreenCanvas)\"]\n      WCoordinator --\u003e WRenderLoop[\"MessageChannel render loop\"]\n      WorkerSetOpt --\u003e WOptions\n      WorkerAppend --\u003e WDataStore[\"Worker DataStore (GPU buffer upload)\"]\n      WorkerResize --\u003e WCoordinator\n      WorkerPointer --\u003e WHitTest[\"Worker hit-testing\u003cbr/\u003e(uses interactionScales with grid coords)\u003cbr/\u003efindNearestPoint/findPointsAtX\"]\n      WorkerZoom --\u003e WCoordinator\n      WorkerInteractionX --\u003e WCoordinator\n      WorkerDispose --\u003e WCleanup[\"Resource cleanup\"]\n    end\n\n    subgraph WorkerOutbound[\"Worker → Main (postMessage)\"]\n      WGPUInit --\u003e|\"ready\"| ReadyMsg[\"ReadyMessage + GPU capabilities + PerformanceCapabilities\"]\n      WRenderLoop --\u003e|\"rendered\"| RenderedMsg[\"RenderedMessage (frame stats)\"]\n      WRenderLoop --\u003e|\"performanceUpdate\"| PerfMsg[\"PerformanceUpdateMessage (FPS, frame time, memory)\"]\n      WHitTest --\u003e|\"tooltipUpdate\"| TooltipMsg[\"TooltipUpdateMessage\u003cbr/\u003e(complete tooltip content + position)\"]\n      WCoordinator --\u003e|\"legendUpdate\"| LegendMsg[\"LegendUpdateMessage\"]\n      WCoordinator --\u003e|\"axisLabelsUpdate\"| AxisMsg[\"AxisLabelsUpdateMessage\"]\n      WHitTest --\u003e|\"hoverChange\"| HoverMsg[\"HoverChangeMessage\"]\n      WHitTest --\u003e|\"click\"| ClickMsg[\"ClickMessage\"]\n      WHitTest --\u003e|\"crosshairMove\"| CrosshairMsg[\"CrosshairMoveMessage\"]\n      WCoordinator --\u003e|\"zoomChange\"| ZoomMsg[\"ZoomChangeMessage\"]\n      WGPUInit --\u003e|\"deviceLost\"| DeviceLostMsg[\"DeviceLostMessage\"]\n      WCleanup --\u003e|\"disposed\"| DisposedMsg[\"DisposedMessage\"]\n      WCoordinator --\u003e|\"error\"| ErrorMsg[\"ErrorMessage\"]\n    end\n\n    subgraph MainThreadDOM[\"Main Thread: DOM Overlay Rendering (ChartGPUWorkerProxy)\"]\n      ReadyMsg --\u003e ProxyOverlays\n      ReadyMsg --\u003e PerfCache[\"Cache PerformanceCapabilities + set isInitialized\"]\n      PerfMsg --\u003e PerfUpdate[\"Cache PerformanceMetrics + notify callbacks\"]\n      TooltipMsg --\u003e DOMTooltip[\"RAF-batched tooltip.show(x, y, content)\u003cbr/\u003e(receives complete tooltip data from worker)\"]\n      LegendMsg --\u003e DOMLegend[\"RAF-batched legend.update(items, theme)\"]\n      AxisMsg --\u003e DOMAxis[\"RAF-batched textOverlay.addLabel(...)\u003cbr/\u003e(auto-handles container overflow)\"]\n      HoverMsg --\u003e DOMHover[\"Re-emit 'mouseover'/'mouseout' events\"]\n      ClickMsg --\u003e DOMClick[\"Re-emit 'click' event\"]\n      CrosshairMsg --\u003e DOMCrosshair[\"Update cached interactionX + emit\"]\n      ZoomMsg --\u003e DOMZoom[\"Update cached zoomRange + zoomState\"]\n      \n      ProxyOverlays --\u003e DOMTooltip\n      ProxyOverlays --\u003e DOMLegend\n      ProxyOverlays --\u003e DOMAxis\n    end\n  end\n\n  subgraph Renderers[\"GPU renderers (src/renderers/*)\"]\n    RenderPass --\u003e GridR[\"Grid\"]\n    RenderPass --\u003e AreaR[\"Area\"]\n    RenderPass --\u003e BarR[\"Bar\"]\n    RenderPass --\u003e ScatterR[\"Scatter\"]\n    RenderPass --\u003e ScatterDensityR[\"Scatter density/heatmap\"]\n    RenderPass --\u003e LineR[\"Line\"]\n    RenderPass --\u003e PieR[\"Pie\"]\n    RenderPass --\u003e CandlestickR[\"Candlestick\"]\n    RenderPass --\u003e CrosshairR[\"Crosshair overlay\"]\n    RenderPass --\u003e HighlightR[\"Hover highlight overlay\"]\n    RenderPass --\u003e AxisR[\"Axes/ticks\"]\n\n    WRenderLoop --\u003e GridR\n  end\n\n  subgraph Shaders[\"WGSL shaders (src/shaders/*)\"]\n    GridR --\u003e gridWGSL[\"grid.wgsl\"]\n    AreaR --\u003e areaWGSL[\"area.wgsl\"]\n    BarR --\u003e barWGSL[\"bar.wgsl\"]\n    ScatterR --\u003e scatterWGSL[\"scatter.wgsl\"]\n    ScatterDensityR --\u003e scatterDensityBinningWGSL[\"scatterDensityBinning.wgsl\"]\n    ScatterDensityR --\u003e scatterDensityColormapWGSL[\"scatterDensityColormap.wgsl\"]\n    LineR --\u003e lineWGSL[\"line.wgsl\"]\n    PieR --\u003e pieWGSL[\"pie.wgsl\"]\n    CandlestickR --\u003e candlestickWGSL[\"candlestick.wgsl\"]\n    CrosshairR --\u003e crosshairWGSL[\"crosshair.wgsl\"]\n    HighlightR --\u003e highlightWGSL[\"highlight.wgsl\"]\n  end\n\n  subgraph ChartSync[\"Chart sync (src/interaction/createChartSync.ts)\"]\n    SyncAPI --\u003e ListenX[\"listen: 'crosshairMove'\"]\n    SyncAPI --\u003e DriveX[\"setCrosshairX(...) on peers\"]\n  end\n\n  InteractionX --\u003e ListenX\n  DriveX --\u003e InstanceAPI\n  CrosshairMsg --\u003e ListenX\n```\n\n## Demo\n\n![ChartGPU demo](https://raw.githubusercontent.com/hunterg325/ChartGPU/main/docs/assets/chart-gpu-demo.gif)\n\n### Candlestick Charts\n\nFinancial OHLC (open-high-low-close) candlestick rendering with classic/hollow style toggle and color customization. The live streaming demo renders **5 million candlesticks at over 100 FPS** with real-time updates.\n\n![Candlestick chart example](docs/assets/candle-stick-example.png)\n\n### Scatter Density (1M points)\n\nGPU-binned density/heatmap mode for scatter plots (`mode: 'density'`) to reveal structure in overplotted point clouds. See [`docs/api/options.md#scatterseriesconfig`](docs/api/options.md#scatterseriesconfig) and the demo in [`examples/scatter-density-1m/`](examples/scatter-density-1m/).\n\n![Scatter density chart example (1M points)](docs/assets/scatter-plot-density-chart-1million-points-example.png)\n\n### 10M points (benchmark)\n\n10,000,000 points rendered at ~120 FPS (benchmark mode).\n\n![10 million point benchmark at 120 FPS](docs/assets/10-million-point-benchmark-120FPS.png)\n\n## Quick start\n\n```ts\nimport { ChartGPU } from 'chartgpu';\nconst container = document.getElementById('chart')!;\nawait ChartGPU.create(container, {\n  series: [{ type: 'line', data: [[0, 1], [1, 3], [2, 2]] }],\n});\n```\n\n### Worker-based rendering (optional)\n\nFor maximum performance with large datasets, use worker-based rendering to keep the main thread responsive:\n\n```ts\nimport { ChartGPU } from 'chartgpu';\nconst container = document.getElementById('chart')!;\n// Identical API, but rendering happens in a Web Worker\nawait ChartGPU.createInWorker(container, {\n  series: [{ type: 'line', data: [[0, 1], [1, 3], [2, 2]] }],\n});\n```\n\n**When to use workers:**\n- Large datasets (\u003e10K points) with frequent updates\n- Real-time streaming data\n- Complex multi-series charts\n- Mobile/low-power devices\n\nSee [Worker API Documentation](https://github.com/hunterg325/ChartGPU/blob/main/docs/api/worker.md) for details.\n\n## Installation\n\n`npm install chartgpu`\n\n## React Integration\n\nReact bindings are available via [`chartgpu-react`](https://github.com/ChartGPU/chartgpu-react):\n\n```bash\nnpm install chartgpu-react\n```\n\n```tsx\nimport { ChartGPUChart } from 'chartgpu-react';\n\nfunction MyChart() {\n  return (\n    \u003cChartGPUChart\n      options={{\n        series: [{ type: 'line', data: [[0, 1], [1, 3], [2, 2]] }],\n      }}\n    /\u003e\n  );\n}\n```\n\nSee the [chartgpu-react repository](https://github.com/ChartGPU/chartgpu-react) for full documentation and examples.\n\n## Browser support (WebGPU required)\n\n- Chrome 113+ or Edge 113+ (WebGPU enabled by default)\n- Safari 18+ (WebGPU enabled by default)\n- Firefox: not supported (WebGPU support in development)\n\n## Documentation\n\n- Full documentation: [Getting Started](https://github.com/hunterg325/ChartGPU/blob/main/docs/GETTING_STARTED.md)\n- API reference: [`docs/api/README.md`](https://github.com/hunterg325/ChartGPU/blob/main/docs/api/README.md)\n\n## Examples\n\n- Browse examples: [`examples/`](https://github.com/hunterg325/ChartGPU/tree/main/examples)\n- Run locally:\n  - `npm install`\n  - `npm run dev` (opens `http://localhost:5176/examples/`)\n\n## Contributing\n\nSee [`CONTRIBUTING.md`](https://github.com/hunterg325/ChartGPU/blob/main/CONTRIBUTING.md).\n\n## License\n\nMIT — see [`LICENSE`](https://github.com/hunterg325/ChartGPU/blob/main/LICENSE).\n","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FChartGPU%2FChartGPU","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FChartGPU%2FChartGPU","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FChartGPU%2FChartGPU/lists"}