This repository was archived by the owner on Jul 4, 2026. It is now read-only.

Repository files navigation

JS Runtime Visualizer

VersionNuxtVueLicense

An interactive, browser-based visualization of the JavaScript Event Loop. Write any JavaScript snippet and watch it execute step by step - the Call Stack, Web APIs, Microtask Queue, and Macrotask Queue all update in real time with animated state transitions.


Table of Contents


Overview

Most developers learn about the JavaScript Event Loop through diagrams or text descriptions. This project makes it tangible - you write real JavaScript, and the visualizer shows exactly what the V8 runtime does with it: which function frames enter and exit the Call Stack, which async operations are delegated to Web APIs, and how Microtasks always flush before the next Macrotask runs.

The engine uses a real AST parser (Acorn) rather than eval(), giving it structured control over execution timing so each step is clearly visible in the UI.


Features

  • Real-time Call Stack visualization with LIFO push/pop animations
  • Web APIs panel showing in-flight async operations with live countdown
  • Microtask Queue (Promises) and Macrotask Queue (setTimeout) displayed side by side
  • Console output panel showing execution order as it happens
  • AST-based interpreter - parses user code into a syntax tree before executing
  • Priority enforcement - Microtasks always drain before Macrotasks
  • Glassmorphism UI with neon glow accents on a dark background
  • GSAP entrance animations and spring-physics list transitions
  • Lenis smooth scroll
  • Fully responsive layout - works on mobile and desktop
  • Client-side only, no server required

Tech Stack

TechnologyRole
Nuxt 4Application framework (CSR mode, compatibilityVersion: 4)
Vue 3UI with Composition API and script setup
PiniaReactive VM state (call stack, queues, logs)
Acorn.jsJavaScript AST parser
GSAPEntrance timeline and item animations
LenisSmooth scroll
Tailwind CSSUtility layout classes
@lucide/vueIcon set
JetBrains MonoMonospace font via Google Fonts

Getting Started

Prerequisites

  • Node.js 20 or higher
  • npm 9 or higher

Installation

Clone the repository:

git clone https://github.com/sha-wrks/Event-Loop-Visualizer.git
cd Event-Loop-Visualizer

Install dependencies:

npm install

Development

Start the development server:

npm run dev

Open http://localhost:3000 in your browser.

Production Build

npm run build
npm run preview

Static Export

npm run generate

The output will be in the .output/public directory, ready to deploy to any static host (Vercel, Netlify, GitHub Pages, Cloudflare Pages).


Project Structure

Event-Loop-Visualizer/
- app/
- app.vue # Root layout - header, code input, visualizer grid
- components/
- AppLogo.vue # SVG brand logo with theme gradient
- visualizer/
- Stack.vue # Call Stack panel
- Queues.vue # Microtask and Macrotask queue panels
- logic/
- engine.ts # AST interpreter and event loop simulation
- stores/
- useVM.ts # Pinia store - virtual machine state
- public/
- logo.svg # SVG favicon
- robots.txt
- nuxt.config.ts # Nuxt configuration, head meta, Google Fonts
- tailwind.config.js # Tailwind theme extensions

How It Works

1. Parsing

When you click Execute, the engine passes your code to acorn.parse(), which returns an AST - a structured JSON tree of every expression, statement, and declaration in your script.

2. Node Processing

The interpreter walks the AST body and identifies three patterns:

  • console.log(...) - pushed and popped on the Call Stack synchronously with an 800ms visual delay per step
  • setTimeout(fn, ms) - registered in the Web APIs panel, then moved to the Macrotask Queue after the specified delay
  • Promise.resolve().then(fn) - added directly to the Microtask Queue

3. Event Loop

A background loop polls every 100ms. Whenever the Call Stack is empty, it checks the queues in priority order:

  1. Microtask Queue - drained completely before checking macrotasks
  2. Macrotask Queue - one task per loop tick

This faithfully reproduces the actual V8 scheduling rules.

4. Reactive UI

All state mutations happen through the Pinia useVMStore. Vue's reactivity system binds the store directly to the animated components, so every push, pop, enqueue, and dequeue triggers the corresponding CSS transition automatically.


Contributing

Contributions are welcome. Please open an issue first to discuss what you would like to change.

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/your-feature)
  3. Commit your changes with a descriptive message
  4. Push to your branch and open a Pull Request

See CONTRIBUTING.md for full guidelines.


License

Distributed under the MIT License. See LICENSE for details.

About

Interactive JavaScript Event Loop visualizer. Write code and watch the Call Stack, Web APIs, Microtask Queue, and Macrotask Queue animate in real time. Built with Nuxt 4, Vue 3, and Acorn.js.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

8 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Jul 4, 2026. It is now read-only.

Repository files navigation

JS Runtime Visualizer

VersionNuxtVueLicense

An interactive, browser-based visualization of the JavaScript Event Loop. Write any JavaScript snippet and watch it execute step by step - the Call Stack, Web APIs, Microtask Queue, and Macrotask Queue all update in real time with animated state transitions.


Table of Contents


Overview

Most developers learn about the JavaScript Event Loop through diagrams or text descriptions. This project makes it tangible - you write real JavaScript, and the visualizer shows exactly what the V8 runtime does with it: which function frames enter and exit the Call Stack, which async operations are delegated to Web APIs, and how Microtasks always flush before the next Macrotask runs.

The engine uses a real AST parser (Acorn) rather than eval(), giving it structured control over execution timing so each step is clearly visible in the UI.


Features

  • Real-time Call Stack visualization with LIFO push/pop animations
  • Web APIs panel showing in-flight async operations with live countdown
  • Microtask Queue (Promises) and Macrotask Queue (setTimeout) displayed side by side
  • Console output panel showing execution order as it happens
  • AST-based interpreter - parses user code into a syntax tree before executing
  • Priority enforcement - Microtasks always drain before Macrotasks
  • Glassmorphism UI with neon glow accents on a dark background
  • GSAP entrance animations and spring-physics list transitions
  • Lenis smooth scroll
  • Fully responsive layout - works on mobile and desktop
  • Client-side only, no server required

Tech Stack

TechnologyRole
Nuxt 4Application framework (CSR mode, compatibilityVersion: 4)
Vue 3UI with Composition API and script setup
PiniaReactive VM state (call stack, queues, logs)
Acorn.jsJavaScript AST parser
GSAPEntrance timeline and item animations
LenisSmooth scroll
Tailwind CSSUtility layout classes
@lucide/vueIcon set
JetBrains MonoMonospace font via Google Fonts

Getting Started

Prerequisites

  • Node.js 20 or higher
  • npm 9 or higher

Installation

Clone the repository:

git clone https://github.com/sha-wrks/Event-Loop-Visualizer.git
cd Event-Loop-Visualizer

Install dependencies:

npm install

Development

Start the development server:

npm run dev

Open http://localhost:3000 in your browser.

Production Build

npm run build
npm run preview

Static Export

npm run generate

The output will be in the .output/public directory, ready to deploy to any static host (Vercel, Netlify, GitHub Pages, Cloudflare Pages).


Project Structure

Event-Loop-Visualizer/
- app/
- app.vue # Root layout - header, code input, visualizer grid
- components/
- AppLogo.vue # SVG brand logo with theme gradient
- visualizer/
- Stack.vue # Call Stack panel
- Queues.vue # Microtask and Macrotask queue panels
- logic/
- engine.ts # AST interpreter and event loop simulation
- stores/
- useVM.ts # Pinia store - virtual machine state
- public/
- logo.svg # SVG favicon
- robots.txt
- nuxt.config.ts # Nuxt configuration, head meta, Google Fonts
- tailwind.config.js # Tailwind theme extensions

How It Works

1. Parsing

When you click Execute, the engine passes your code to acorn.parse(), which returns an AST - a structured JSON tree of every expression, statement, and declaration in your script.

2. Node Processing

The interpreter walks the AST body and identifies three patterns:

  • console.log(...) - pushed and popped on the Call Stack synchronously with an 800ms visual delay per step
  • setTimeout(fn, ms) - registered in the Web APIs panel, then moved to the Macrotask Queue after the specified delay
  • Promise.resolve().then(fn) - added directly to the Microtask Queue

3. Event Loop

A background loop polls every 100ms. Whenever the Call Stack is empty, it checks the queues in priority order:

  1. Microtask Queue - drained completely before checking macrotasks
  2. Macrotask Queue - one task per loop tick

This faithfully reproduces the actual V8 scheduling rules.

4. Reactive UI

All state mutations happen through the Pinia useVMStore. Vue's reactivity system binds the store directly to the animated components, so every push, pop, enqueue, and dequeue triggers the corresponding CSS transition automatically.


Contributing

Contributions are welcome. Please open an issue first to discuss what you would like to change.

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/your-feature)
  3. Commit your changes with a descriptive message
  4. Push to your branch and open a Pull Request

See CONTRIBUTING.md for full guidelines.


License

Distributed under the MIT License. See LICENSE for details.

About

Interactive JavaScript Event Loop visualizer. Write code and watch the Call Stack, Web APIs, Microtask Queue, and Macrotask Queue animate in real time. Built with Nuxt 4, Vue 3, and Acorn.js.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

8 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jul 4, 2026. It is now read-only.

Repository files navigation

JS Runtime Visualizer

VersionNuxtVueLicense

An interactive, browser-based visualization of the JavaScript Event Loop. Write any JavaScript snippet and watch it execute step by step - the Call Stack, Web APIs, Microtask Queue, and Macrotask Queue all update in real time with animated state transitions.


Table of Contents


Overview

Most developers learn about the JavaScript Event Loop through diagrams or text descriptions. This project makes it tangible - you write real JavaScript, and the visualizer shows exactly what the V8 runtime does with it: which function frames enter and exit the Call Stack, which async operations are delegated to Web APIs, and how Microtasks always flush before the next Macrotask runs.

The engine uses a real AST parser (Acorn) rather than eval(), giving it structured control over execution timing so each step is clearly visible in the UI.


Features

  • Real-time Call Stack visualization with LIFO push/pop animations
  • Web APIs panel showing in-flight async operations with live countdown
  • Microtask Queue (Promises) and Macrotask Queue (setTimeout) displayed side by side
  • Console output panel showing execution order as it happens
  • AST-based interpreter - parses user code into a syntax tree before executing
  • Priority enforcement - Microtasks always drain before Macrotasks
  • Glassmorphism UI with neon glow accents on a dark background
  • GSAP entrance animations and spring-physics list transitions
  • Lenis smooth scroll
  • Fully responsive layout - works on mobile and desktop
  • Client-side only, no server required

Tech Stack

TechnologyRole
Nuxt 4Application framework (CSR mode, compatibilityVersion: 4)
Vue 3UI with Composition API and script setup
PiniaReactive VM state (call stack, queues, logs)
Acorn.jsJavaScript AST parser
GSAPEntrance timeline and item animations
LenisSmooth scroll
Tailwind CSSUtility layout classes
@lucide/vueIcon set
JetBrains MonoMonospace font via Google Fonts

Getting Started

Prerequisites

  • Node.js 20 or higher
  • npm 9 or higher

Installation

Clone the repository:

git clone https://github.com/sha-wrks/Event-Loop-Visualizer.git
cd Event-Loop-Visualizer

Install dependencies:

npm install

Development

Start the development server:

npm run dev

Open http://localhost:3000 in your browser.

Production Build

npm run build
npm run preview

Static Export

npm run generate

The output will be in the .output/public directory, ready to deploy to any static host (Vercel, Netlify, GitHub Pages, Cloudflare Pages).


Project Structure

Event-Loop-Visualizer/
- app/
- app.vue # Root layout - header, code input, visualizer grid
- components/
- AppLogo.vue # SVG brand logo with theme gradient
- visualizer/
- Stack.vue # Call Stack panel
- Queues.vue # Microtask and Macrotask queue panels
- logic/
- engine.ts # AST interpreter and event loop simulation
- stores/
- useVM.ts # Pinia store - virtual machine state
- public/
- logo.svg # SVG favicon
- robots.txt
- nuxt.config.ts # Nuxt configuration, head meta, Google Fonts
- tailwind.config.js # Tailwind theme extensions

How It Works

1. Parsing

When you click Execute, the engine passes your code to acorn.parse(), which returns an AST - a structured JSON tree of every expression, statement, and declaration in your script.

2. Node Processing

The interpreter walks the AST body and identifies three patterns:

  • console.log(...) - pushed and popped on the Call Stack synchronously with an 800ms visual delay per step
  • setTimeout(fn, ms) - registered in the Web APIs panel, then moved to the Macrotask Queue after the specified delay
  • Promise.resolve().then(fn) - added directly to the Microtask Queue

3. Event Loop

A background loop polls every 100ms. Whenever the Call Stack is empty, it checks the queues in priority order:

  1. Microtask Queue - drained completely before checking macrotasks
  2. Macrotask Queue - one task per loop tick

This faithfully reproduces the actual V8 scheduling rules.

4. Reactive UI

All state mutations happen through the Pinia useVMStore. Vue's reactivity system binds the store directly to the animated components, so every push, pop, enqueue, and dequeue triggers the corresponding CSS transition automatically.


Contributing

Contributions are welcome. Please open an issue first to discuss what you would like to change.

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/your-feature)
  3. Commit your changes with a descriptive message
  4. Push to your branch and open a Pull Request

See CONTRIBUTING.md for full guidelines.


License

Distributed under the MIT License. See LICENSE for details.

About

Interactive JavaScript Event Loop visualizer. Write code and watch the Call Stack, Web APIs, Microtask Queue, and Macrotask Queue animate in real time. Built with Nuxt 4, Vue 3, and Acorn.js.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

8 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jul 4, 2026. It is now read-only.

Repository files navigation

JS Runtime Visualizer

VersionNuxtVueLicense

An interactive, browser-based visualization of the JavaScript Event Loop. Write any JavaScript snippet and watch it execute step by step - the Call Stack, Web APIs, Microtask Queue, and Macrotask Queue all update in real time with animated state transitions.


Table of Contents


Overview

Most developers learn about the JavaScript Event Loop through diagrams or text descriptions. This project makes it tangible - you write real JavaScript, and the visualizer shows exactly what the V8 runtime does with it: which function frames enter and exit the Call Stack, which async operations are delegated to Web APIs, and how Microtasks always flush before the next Macrotask runs.

The engine uses a real AST parser (Acorn) rather than eval(), giving it structured control over execution timing so each step is clearly visible in the UI.


Features

  • Real-time Call Stack visualization with LIFO push/pop animations
  • Web APIs panel showing in-flight async operations with live countdown
  • Microtask Queue (Promises) and Macrotask Queue (setTimeout) displayed side by side
  • Console output panel showing execution order as it happens
  • AST-based interpreter - parses user code into a syntax tree before executing
  • Priority enforcement - Microtasks always drain before Macrotasks
  • Glassmorphism UI with neon glow accents on a dark background
  • GSAP entrance animations and spring-physics list transitions
  • Lenis smooth scroll
  • Fully responsive layout - works on mobile and desktop
  • Client-side only, no server required

Tech Stack

TechnologyRole
Nuxt 4Application framework (CSR mode, compatibilityVersion: 4)
Vue 3UI with Composition API and script setup
PiniaReactive VM state (call stack, queues, logs)
Acorn.jsJavaScript AST parser
GSAPEntrance timeline and item animations
LenisSmooth scroll
Tailwind CSSUtility layout classes
@lucide/vueIcon set
JetBrains MonoMonospace font via Google Fonts

Getting Started

Prerequisites

  • Node.js 20 or higher
  • npm 9 or higher

Installation

Clone the repository:

git clone https://github.com/sha-wrks/Event-Loop-Visualizer.git
cd Event-Loop-Visualizer

Install dependencies:

npm install

Development

Start the development server:

npm run dev

Open http://localhost:3000 in your browser.

Production Build

npm run build
npm run preview

Static Export

npm run generate

The output will be in the .output/public directory, ready to deploy to any static host (Vercel, Netlify, GitHub Pages, Cloudflare Pages).


Project Structure

Event-Loop-Visualizer/
- app/
- app.vue # Root layout - header, code input, visualizer grid
- components/
- AppLogo.vue # SVG brand logo with theme gradient
- visualizer/
- Stack.vue # Call Stack panel
- Queues.vue # Microtask and Macrotask queue panels
- logic/
- engine.ts # AST interpreter and event loop simulation
- stores/
- useVM.ts # Pinia store - virtual machine state
- public/
- logo.svg # SVG favicon
- robots.txt
- nuxt.config.ts # Nuxt configuration, head meta, Google Fonts
- tailwind.config.js # Tailwind theme extensions

How It Works

1. Parsing

When you click Execute, the engine passes your code to acorn.parse(), which returns an AST - a structured JSON tree of every expression, statement, and declaration in your script.

2. Node Processing

The interpreter walks the AST body and identifies three patterns:

  • console.log(...) - pushed and popped on the Call Stack synchronously with an 800ms visual delay per step
  • setTimeout(fn, ms) - registered in the Web APIs panel, then moved to the Macrotask Queue after the specified delay
  • Promise.resolve().then(fn) - added directly to the Microtask Queue

3. Event Loop

A background loop polls every 100ms. Whenever the Call Stack is empty, it checks the queues in priority order:

  1. Microtask Queue - drained completely before checking macrotasks
  2. Macrotask Queue - one task per loop tick

This faithfully reproduces the actual V8 scheduling rules.

4. Reactive UI

All state mutations happen through the Pinia useVMStore. Vue's reactivity system binds the store directly to the animated components, so every push, pop, enqueue, and dequeue triggers the corresponding CSS transition automatically.


Contributing

Contributions are welcome. Please open an issue first to discuss what you would like to change.

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/your-feature)
  3. Commit your changes with a descriptive message
  4. Push to your branch and open a Pull Request

See CONTRIBUTING.md for full guidelines.


License

Distributed under the MIT License. See LICENSE for details.

About

Interactive JavaScript Event Loop visualizer. Write code and watch the Call Stack, Web APIs, Microtask Queue, and Macrotask Queue animate in real time. Built with Nuxt 4, Vue 3, and Acorn.js.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

8 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Jul 4, 2026. It is now read-only.

Repository files navigation

JS Runtime Visualizer

VersionNuxtVueLicense

An interactive, browser-based visualization of the JavaScript Event Loop. Write any JavaScript snippet and watch it execute step by step - the Call Stack, Web APIs, Microtask Queue, and Macrotask Queue all update in real time with animated state transitions.


Table of Contents


Overview

Most developers learn about the JavaScript Event Loop through diagrams or text descriptions. This project makes it tangible - you write real JavaScript, and the visualizer shows exactly what the V8 runtime does with it: which function frames enter and exit the Call Stack, which async operations are delegated to Web APIs, and how Microtasks always flush before the next Macrotask runs.

The engine uses a real AST parser (Acorn) rather than eval(), giving it structured control over execution timing so each step is clearly visible in the UI.


Features

  • Real-time Call Stack visualization with LIFO push/pop animations
  • Web APIs panel showing in-flight async operations with live countdown
  • Microtask Queue (Promises) and Macrotask Queue (setTimeout) displayed side by side
  • Console output panel showing execution order as it happens
  • AST-based interpreter - parses user code into a syntax tree before executing
  • Priority enforcement - Microtasks always drain before Macrotasks
  • Glassmorphism UI with neon glow accents on a dark background
  • GSAP entrance animations and spring-physics list transitions
  • Lenis smooth scroll
  • Fully responsive layout - works on mobile and desktop
  • Client-side only, no server required

Tech Stack

TechnologyRole
Nuxt 4Application framework (CSR mode, compatibilityVersion: 4)
Vue 3UI with Composition API and script setup
PiniaReactive VM state (call stack, queues, logs)
Acorn.jsJavaScript AST parser
GSAPEntrance timeline and item animations
LenisSmooth scroll
Tailwind CSSUtility layout classes
@lucide/vueIcon set
JetBrains MonoMonospace font via Google Fonts

Getting Started

Prerequisites

  • Node.js 20 or higher
  • npm 9 or higher

Installation

Clone the repository:

git clone https://github.com/sha-wrks/Event-Loop-Visualizer.git
cd Event-Loop-Visualizer

Install dependencies:

npm install

Development

Start the development server:

npm run dev

Open http://localhost:3000 in your browser.

Production Build

npm run build
npm run preview

Static Export

npm run generate

The output will be in the .output/public directory, ready to deploy to any static host (Vercel, Netlify, GitHub Pages, Cloudflare Pages).


Project Structure

Event-Loop-Visualizer/
- app/
- app.vue # Root layout - header, code input, visualizer grid
- components/
- AppLogo.vue # SVG brand logo with theme gradient
- visualizer/
- Stack.vue # Call Stack panel
- Queues.vue # Microtask and Macrotask queue panels
- logic/
- engine.ts # AST interpreter and event loop simulation
- stores/
- useVM.ts # Pinia store - virtual machine state
- public/
- logo.svg # SVG favicon
- robots.txt
- nuxt.config.ts # Nuxt configuration, head meta, Google Fonts
- tailwind.config.js # Tailwind theme extensions

How It Works

1. Parsing

When you click Execute, the engine passes your code to acorn.parse(), which returns an AST - a structured JSON tree of every expression, statement, and declaration in your script.

2. Node Processing

The interpreter walks the AST body and identifies three patterns:

  • console.log(...) - pushed and popped on the Call Stack synchronously with an 800ms visual delay per step
  • setTimeout(fn, ms) - registered in the Web APIs panel, then moved to the Macrotask Queue after the specified delay
  • Promise.resolve().then(fn) - added directly to the Microtask Queue

3. Event Loop

A background loop polls every 100ms. Whenever the Call Stack is empty, it checks the queues in priority order:

  1. Microtask Queue - drained completely before checking macrotasks
  2. Macrotask Queue - one task per loop tick

This faithfully reproduces the actual V8 scheduling rules.

4. Reactive UI

All state mutations happen through the Pinia useVMStore. Vue's reactivity system binds the store directly to the animated components, so every push, pop, enqueue, and dequeue triggers the corresponding CSS transition automatically.


Contributing

Contributions are welcome. Please open an issue first to discuss what you would like to change.

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/your-feature)
  3. Commit your changes with a descriptive message
  4. Push to your branch and open a Pull Request

See CONTRIBUTING.md for full guidelines.


License

Distributed under the MIT License. See LICENSE for details.

About

Interactive JavaScript Event Loop visualizer. Write code and watch the Call Stack, Web APIs, Microtask Queue, and Macrotask Queue animate in real time. Built with Nuxt 4, Vue 3, and Acorn.js.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

8 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jul 4, 2026. It is now read-only.

Repository files navigation

JS Runtime Visualizer

VersionNuxtVueLicense

An interactive, browser-based visualization of the JavaScript Event Loop. Write any JavaScript snippet and watch it execute step by step - the Call Stack, Web APIs, Microtask Queue, and Macrotask Queue all update in real time with animated state transitions.


Table of Contents


Overview

Most developers learn about the JavaScript Event Loop through diagrams or text descriptions. This project makes it tangible - you write real JavaScript, and the visualizer shows exactly what the V8 runtime does with it: which function frames enter and exit the Call Stack, which async operations are delegated to Web APIs, and how Microtasks always flush before the next Macrotask runs.

The engine uses a real AST parser (Acorn) rather than eval(), giving it structured control over execution timing so each step is clearly visible in the UI.


Features

  • Real-time Call Stack visualization with LIFO push/pop animations
  • Web APIs panel showing in-flight async operations with live countdown
  • Microtask Queue (Promises) and Macrotask Queue (setTimeout) displayed side by side
  • Console output panel showing execution order as it happens
  • AST-based interpreter - parses user code into a syntax tree before executing
  • Priority enforcement - Microtasks always drain before Macrotasks
  • Glassmorphism UI with neon glow accents on a dark background
  • GSAP entrance animations and spring-physics list transitions
  • Lenis smooth scroll
  • Fully responsive layout - works on mobile and desktop
  • Client-side only, no server required

Tech Stack

TechnologyRole
Nuxt 4Application framework (CSR mode, compatibilityVersion: 4)
Vue 3UI with Composition API and script setup
PiniaReactive VM state (call stack, queues, logs)
Acorn.jsJavaScript AST parser
GSAPEntrance timeline and item animations
LenisSmooth scroll
Tailwind CSSUtility layout classes
@lucide/vueIcon set
JetBrains MonoMonospace font via Google Fonts

Getting Started

Prerequisites

  • Node.js 20 or higher
  • npm 9 or higher

Installation

Clone the repository:

git clone https://github.com/sha-wrks/Event-Loop-Visualizer.git
cd Event-Loop-Visualizer

Install dependencies:

npm install

Development

Start the development server:

npm run dev

Open http://localhost:3000 in your browser.

Production Build

npm run build
npm run preview

Static Export

npm run generate

The output will be in the .output/public directory, ready to deploy to any static host (Vercel, Netlify, GitHub Pages, Cloudflare Pages).


Project Structure

Event-Loop-Visualizer/
- app/
- app.vue # Root layout - header, code input, visualizer grid
- components/
- AppLogo.vue # SVG brand logo with theme gradient
- visualizer/
- Stack.vue # Call Stack panel
- Queues.vue # Microtask and Macrotask queue panels
- logic/
- engine.ts # AST interpreter and event loop simulation
- stores/
- useVM.ts # Pinia store - virtual machine state
- public/
- logo.svg # SVG favicon
- robots.txt
- nuxt.config.ts # Nuxt configuration, head meta, Google Fonts
- tailwind.config.js # Tailwind theme extensions

How It Works

1. Parsing

When you click Execute, the engine passes your code to acorn.parse(), which returns an AST - a structured JSON tree of every expression, statement, and declaration in your script.

2. Node Processing

The interpreter walks the AST body and identifies three patterns:

  • console.log(...) - pushed and popped on the Call Stack synchronously with an 800ms visual delay per step
  • setTimeout(fn, ms) - registered in the Web APIs panel, then moved to the Macrotask Queue after the specified delay
  • Promise.resolve().then(fn) - added directly to the Microtask Queue

3. Event Loop

A background loop polls every 100ms. Whenever the Call Stack is empty, it checks the queues in priority order:

  1. Microtask Queue - drained completely before checking macrotasks
  2. Macrotask Queue - one task per loop tick

This faithfully reproduces the actual V8 scheduling rules.

4. Reactive UI

All state mutations happen through the Pinia useVMStore. Vue's reactivity system binds the store directly to the animated components, so every push, pop, enqueue, and dequeue triggers the corresponding CSS transition automatically.


Contributing

Contributions are welcome. Please open an issue first to discuss what you would like to change.

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/your-feature)
  3. Commit your changes with a descriptive message
  4. Push to your branch and open a Pull Request

See CONTRIBUTING.md for full guidelines.


License

Distributed under the MIT License. See LICENSE for details.

About

Interactive JavaScript Event Loop visualizer. Write code and watch the Call Stack, Web APIs, Microtask Queue, and Macrotask Queue animate in real time. Built with Nuxt 4, Vue 3, and Acorn.js.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

8 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jul 4, 2026. It is now read-only.

Repository files navigation

JS Runtime Visualizer

VersionNuxtVueLicense

An interactive, browser-based visualization of the JavaScript Event Loop. Write any JavaScript snippet and watch it execute step by step - the Call Stack, Web APIs, Microtask Queue, and Macrotask Queue all update in real time with animated state transitions.


Table of Contents


Overview

Most developers learn about the JavaScript Event Loop through diagrams or text descriptions. This project makes it tangible - you write real JavaScript, and the visualizer shows exactly what the V8 runtime does with it: which function frames enter and exit the Call Stack, which async operations are delegated to Web APIs, and how Microtasks always flush before the next Macrotask runs.

The engine uses a real AST parser (Acorn) rather than eval(), giving it structured control over execution timing so each step is clearly visible in the UI.


Features

  • Real-time Call Stack visualization with LIFO push/pop animations
  • Web APIs panel showing in-flight async operations with live countdown
  • Microtask Queue (Promises) and Macrotask Queue (setTimeout) displayed side by side
  • Console output panel showing execution order as it happens
  • AST-based interpreter - parses user code into a syntax tree before executing
  • Priority enforcement - Microtasks always drain before Macrotasks
  • Glassmorphism UI with neon glow accents on a dark background
  • GSAP entrance animations and spring-physics list transitions
  • Lenis smooth scroll
  • Fully responsive layout - works on mobile and desktop
  • Client-side only, no server required

Tech Stack

TechnologyRole
Nuxt 4Application framework (CSR mode, compatibilityVersion: 4)
Vue 3UI with Composition API and script setup
PiniaReactive VM state (call stack, queues, logs)
Acorn.jsJavaScript AST parser
GSAPEntrance timeline and item animations
LenisSmooth scroll
Tailwind CSSUtility layout classes
@lucide/vueIcon set
JetBrains MonoMonospace font via Google Fonts

Getting Started

Prerequisites

  • Node.js 20 or higher
  • npm 9 or higher

Installation

Clone the repository:

git clone https://github.com/sha-wrks/Event-Loop-Visualizer.git
cd Event-Loop-Visualizer

Install dependencies:

npm install

Development

Start the development server:

npm run dev

Open http://localhost:3000 in your browser.

Production Build

npm run build
npm run preview

Static Export

npm run generate

The output will be in the .output/public directory, ready to deploy to any static host (Vercel, Netlify, GitHub Pages, Cloudflare Pages).


Project Structure

Event-Loop-Visualizer/
- app/
- app.vue # Root layout - header, code input, visualizer grid
- components/
- AppLogo.vue # SVG brand logo with theme gradient
- visualizer/
- Stack.vue # Call Stack panel
- Queues.vue # Microtask and Macrotask queue panels
- logic/
- engine.ts # AST interpreter and event loop simulation
- stores/
- useVM.ts # Pinia store - virtual machine state
- public/
- logo.svg # SVG favicon
- robots.txt
- nuxt.config.ts # Nuxt configuration, head meta, Google Fonts
- tailwind.config.js # Tailwind theme extensions

How It Works

1. Parsing

When you click Execute, the engine passes your code to acorn.parse(), which returns an AST - a structured JSON tree of every expression, statement, and declaration in your script.

2. Node Processing

The interpreter walks the AST body and identifies three patterns:

  • console.log(...) - pushed and popped on the Call Stack synchronously with an 800ms visual delay per step
  • setTimeout(fn, ms) - registered in the Web APIs panel, then moved to the Macrotask Queue after the specified delay
  • Promise.resolve().then(fn) - added directly to the Microtask Queue

3. Event Loop

A background loop polls every 100ms. Whenever the Call Stack is empty, it checks the queues in priority order:

  1. Microtask Queue - drained completely before checking macrotasks
  2. Macrotask Queue - one task per loop tick

This faithfully reproduces the actual V8 scheduling rules.

4. Reactive UI

All state mutations happen through the Pinia useVMStore. Vue's reactivity system binds the store directly to the animated components, so every push, pop, enqueue, and dequeue triggers the corresponding CSS transition automatically.


Contributing

Contributions are welcome. Please open an issue first to discuss what you would like to change.

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/your-feature)
  3. Commit your changes with a descriptive message
  4. Push to your branch and open a Pull Request

See CONTRIBUTING.md for full guidelines.


License

Distributed under the MIT License. See LICENSE for details.

About

Interactive JavaScript Event Loop visualizer. Write code and watch the Call Stack, Web APIs, Microtask Queue, and Macrotask Queue animate in real time. Built with Nuxt 4, Vue 3, and Acorn.js.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

8 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Jul 4, 2026. It is now read-only.

Repository files navigation

JS Runtime Visualizer

VersionNuxtVueLicense

An interactive, browser-based visualization of the JavaScript Event Loop. Write any JavaScript snippet and watch it execute step by step - the Call Stack, Web APIs, Microtask Queue, and Macrotask Queue all update in real time with animated state transitions.


Table of Contents


Overview

Most developers learn about the JavaScript Event Loop through diagrams or text descriptions. This project makes it tangible - you write real JavaScript, and the visualizer shows exactly what the V8 runtime does with it: which function frames enter and exit the Call Stack, which async operations are delegated to Web APIs, and how Microtasks always flush before the next Macrotask runs.

The engine uses a real AST parser (Acorn) rather than eval(), giving it structured control over execution timing so each step is clearly visible in the UI.


Features

  • Real-time Call Stack visualization with LIFO push/pop animations
  • Web APIs panel showing in-flight async operations with live countdown
  • Microtask Queue (Promises) and Macrotask Queue (setTimeout) displayed side by side
  • Console output panel showing execution order as it happens
  • AST-based interpreter - parses user code into a syntax tree before executing
  • Priority enforcement - Microtasks always drain before Macrotasks
  • Glassmorphism UI with neon glow accents on a dark background
  • GSAP entrance animations and spring-physics list transitions
  • Lenis smooth scroll
  • Fully responsive layout - works on mobile and desktop
  • Client-side only, no server required

Tech Stack

TechnologyRole
Nuxt 4Application framework (CSR mode, compatibilityVersion: 4)
Vue 3UI with Composition API and script setup
PiniaReactive VM state (call stack, queues, logs)
Acorn.jsJavaScript AST parser
GSAPEntrance timeline and item animations
LenisSmooth scroll
Tailwind CSSUtility layout classes
@lucide/vueIcon set
JetBrains MonoMonospace font via Google Fonts

Getting Started

Prerequisites

  • Node.js 20 or higher
  • npm 9 or higher

Installation

Clone the repository:

git clone https://github.com/sha-wrks/Event-Loop-Visualizer.git
cd Event-Loop-Visualizer

Install dependencies:

npm install

Development

Start the development server:

npm run dev

Open http://localhost:3000 in your browser.

Production Build

npm run build
npm run preview

Static Export

npm run generate

The output will be in the .output/public directory, ready to deploy to any static host (Vercel, Netlify, GitHub Pages, Cloudflare Pages).


Project Structure

Event-Loop-Visualizer/
- app/
- app.vue # Root layout - header, code input, visualizer grid
- components/
- AppLogo.vue # SVG brand logo with theme gradient
- visualizer/
- Stack.vue # Call Stack panel
- Queues.vue # Microtask and Macrotask queue panels
- logic/
- engine.ts # AST interpreter and event loop simulation
- stores/
- useVM.ts # Pinia store - virtual machine state
- public/
- logo.svg # SVG favicon
- robots.txt
- nuxt.config.ts # Nuxt configuration, head meta, Google Fonts
- tailwind.config.js # Tailwind theme extensions

How It Works

1. Parsing

When you click Execute, the engine passes your code to acorn.parse(), which returns an AST - a structured JSON tree of every expression, statement, and declaration in your script.

2. Node Processing

The interpreter walks the AST body and identifies three patterns:

  • console.log(...) - pushed and popped on the Call Stack synchronously with an 800ms visual delay per step
  • setTimeout(fn, ms) - registered in the Web APIs panel, then moved to the Macrotask Queue after the specified delay
  • Promise.resolve().then(fn) - added directly to the Microtask Queue

3. Event Loop

A background loop polls every 100ms. Whenever the Call Stack is empty, it checks the queues in priority order:

  1. Microtask Queue - drained completely before checking macrotasks
  2. Macrotask Queue - one task per loop tick

This faithfully reproduces the actual V8 scheduling rules.

4. Reactive UI

All state mutations happen through the Pinia useVMStore. Vue's reactivity system binds the store directly to the animated components, so every push, pop, enqueue, and dequeue triggers the corresponding CSS transition automatically.


Contributing

Contributions are welcome. Please open an issue first to discuss what you would like to change.

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/your-feature)
  3. Commit your changes with a descriptive message
  4. Push to your branch and open a Pull Request

See CONTRIBUTING.md for full guidelines.


License

Distributed under the MIT License. See LICENSE for details.

About

Interactive JavaScript Event Loop visualizer. Write code and watch the Call Stack, Web APIs, Microtask Queue, and Macrotask Queue animate in real time. Built with Nuxt 4, Vue 3, and Acorn.js.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

8 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages