<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mykyta Khmel</title>
    <description>The latest articles on DEV Community by Mykyta Khmel (@hmelenok).</description>
    <link>https://dev.to/hmelenok</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F489273%2F83c03ca8-a360-4da4-91d3-70b4131df9af.jpeg</url>
      <title>DEV Community: Mykyta Khmel</title>
      <link>https://dev.to/hmelenok</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hmelenok"/>
    <language>en</language>
    <item>
      <title>Browser APIs - the whole ocean of features to build apps</title>
      <dc:creator>Mykyta Khmel</dc:creator>
      <pubDate>Fri, 19 Jun 2026 12:47:43 +0000</pubDate>
      <link>https://dev.to/hmelenok/browser-apis-the-whole-ocean-of-features-to-build-apps-14mg</link>
      <guid>https://dev.to/hmelenok/browser-apis-the-whole-ocean-of-features-to-build-apps-14mg</guid>
      <description>&lt;p&gt;Your browser ships somewhere between &lt;strong&gt;350 and 450 APIs&lt;/strong&gt; (depending on the browser). Most developers reach for the same dozen. There's an ocean of platform features sitting unused.&lt;/p&gt;

&lt;p&gt;The web platform is enormous. We just keep treating it like a phone book.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;How to know what you need? &lt;a href="https://developer.mozilla.org/en-US/" rel="noopener noreferrer"&gt;MDN&lt;/a&gt; is nice but it's just a catalog. Most of a time you need to know what to look for. &lt;a href="https://caniuse.com/" rel="noopener noreferrer"&gt;caniuse&lt;/a&gt; is per-feature, &lt;a href="https://web.dev/" rel="noopener noreferrer"&gt;web.dev&lt;/a&gt; is article-driven. Nothing gives you the map.&lt;/p&gt;

&lt;p&gt;What I wanted was a map - a single picture of the whole platform, color-coded by what my browser actually ships, with live demos I could click and feel.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tool
&lt;/h2&gt;

&lt;p&gt;I built Browser API Atlas — an interactive graph of every major web platform API, color-coded by what your browser actually supports right now.&lt;/p&gt;

&lt;h3&gt;
  
  
  It knows YOUR browser
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftv8wjgif7dpstufq2k6q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftv8wjgif7dpstufq2k6q.png" alt="Header says: Chrome 149 · macOS 26 · 354/380." width="494" height="129"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The header pill tells you the score at a glance: "Chrome 149 · macOS 26 · 354/380."&lt;/p&gt;

&lt;p&gt;There's also a "✨ N APIs detected in your browser that aren't in the atlas yet" banner — the page walks window, navigator, and document at runtime and surfaces anything it finds that isn't in the catalog. Often that means you've stumbled onto something brand-new before it hits MDN.&lt;/p&gt;

&lt;h3&gt;
  
  
  Four ways to slice the graph
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz1ps52v4num2xl70h9p1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz1ps52v4num2xl70h9p1.png" alt="Site navigation filtering control" width="689" height="130"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;category&lt;/code&gt; — cluster by domain (&lt;code&gt;Storage&lt;/code&gt;, &lt;code&gt;Network&lt;/code&gt;, &lt;code&gt;Sensors&lt;/code&gt; etc.)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;baseline&lt;/code&gt; — chronological. Read left to right for "when did the web get X" — 2015 widely-Baseline on the left, newly available on the right.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;A–Z&lt;/code&gt; — quick lookup&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;graph&lt;/code&gt; — relationship-driven. Web Audio nodes orbit &lt;code&gt;AudioContext&lt;/code&gt;. WebGPU primitives radiate from &lt;code&gt;GPU&lt;/code&gt;. WebRTC family clusters around &lt;code&gt;RTCPeerConnection&lt;/code&gt;. This is where the structure of the platform shows up.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Live demos
&lt;/h3&gt;

&lt;p&gt;Every catalogued API can have a demo. Click the node → run it in the detail panel.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Storage&lt;/code&gt; / &lt;code&gt;Files&lt;/code&gt; (&lt;code&gt;localStorage&lt;/code&gt;, &lt;code&gt;IndexedDB&lt;/code&gt;, &lt;code&gt;OPFS&lt;/code&gt;, &lt;code&gt;Cache&lt;/code&gt;, &lt;code&gt;BroadcastChannel&lt;/code&gt;), the frontier set (&lt;code&gt;EyeDropper&lt;/code&gt;, &lt;code&gt;View Transitions&lt;/code&gt;, &lt;code&gt;DocPiP&lt;/code&gt;, &lt;code&gt;Sanitizer&lt;/code&gt;, &lt;code&gt;Temporal&lt;/code&gt;, &lt;code&gt;CSS Custom Highlight&lt;/code&gt;), platform UI + audio (&lt;code&gt;Notifications&lt;/code&gt;, &lt;code&gt;Web Share&lt;/code&gt;, &lt;code&gt;Web Audio oscillator&lt;/code&gt;, &lt;code&gt;SubtleCrypto&lt;/code&gt;, &lt;code&gt;IntersectionObserver&lt;/code&gt;, &lt;code&gt;ResizeObserver&lt;/code&gt;, &lt;code&gt;Web Animations&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;The pattern is intentionally easy — every demo is one file, ~80 lines. Drop it in src/demos/, the build picks it up.&lt;/p&gt;

&lt;p&gt;Like &lt;code&gt;EyeDropper&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzzq94xtfwndg2wj6h6xt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzzq94xtfwndg2wj6h6xt.png" alt="EyeDropper demo panel" width="441" height="210"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Pick any color visible on screen&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dropper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;EyeDropper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;sRGBHex&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;dropper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sRGBHex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;            &lt;span class="c1"&gt;// '#ff5733'&lt;/span&gt;

&lt;span class="c1"&gt;// Handle user cancellation (Esc)&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;dropper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AbortError&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Shareable views
&lt;/h3&gt;

&lt;p&gt;The URL contains your filter, sort, search, and selection state. The URL bar is the share button:&lt;br&gt;
&lt;code&gt;?api=api.EyeDropper&amp;amp;sort=baseline&amp;amp;cat=storage,files,network&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Open data, open source
&lt;/h3&gt;

&lt;p&gt;A weekly GitHub Action bumps &lt;code&gt;@mdn/browser-compat-data&lt;/code&gt; + &lt;code&gt;web-features&lt;/code&gt; to their latest releases, rebuilds the catalog, and opens a PR if anything changed. New APIs land in the atlas roughly seven days after they appear in BCD upstream. No manual maintenance.&lt;br&gt;
So the atlas stays current with the web platform automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Behind the scenes
&lt;/h2&gt;

&lt;p&gt;Vite + React 19 + TypeScript. Graph by @xyflow/react, layout by ELK. Tailwind v4, Shiki for highlighting, Zustand for state.&lt;/p&gt;

&lt;p&gt;The build pipeline is the interesting bit. At build time, a Node script joins &lt;a class="mentioned-user" href="https://dev.to/mdn"&gt;@mdn&lt;/a&gt;/browser-compat-data (5 MB of raw compatibility data) with web-features (Baseline classifications) and the curated api-selection.ts to emit catalog.json — about 30 KB of slim, typed entries. The runtime app only loads the slim catalog; the upstream packages never reach the bundle.&lt;/p&gt;

&lt;p&gt;The graph layout uses ELK's layered algorithm in graph-sort mode and rectpacking for category/A-Z. ELK is huge (~1.4 MB) so it's dynamically imported and renders after first paint — keeps the initial JS under 200 KB gzipped.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;🌊 Open the atlas: &lt;a href="//hmelenok.github.io/browser-api-atlas"&gt;Browser API Atlas&lt;/a&gt;&lt;br&gt;
⏱ Baseline timeline view (when did the web get X): &lt;a href="https://hmelenok.github.io/browser-api-atlas/?sort=baseline" rel="noopener noreferrer"&gt;?sort=baseline&lt;/a&gt;&lt;br&gt;
🕸 Relationship graph view (API families): &lt;a href="https://hmelenok.github.io/browser-api-atlas/?sort=baseline" rel="noopener noreferrer"&gt;?sort=hierarchy&lt;/a&gt;&lt;br&gt;
🎨 Try the EyeDropper demo: &lt;a href="https://hmelenok.github.io/browser-api-atlas/?api=api.EyeDropper" rel="noopener noreferrer"&gt;?api=api.EyeDropper&lt;/a&gt;&lt;br&gt;
🪟 Document PiP demo: &lt;a href="https://hmelenok.github.io/browser-api-atlas/?api=api.DocumentPictureInPicture&amp;amp;q=DocumentPictureInPicture" rel="noopener noreferrer"&gt;?api=api.DocumentPictureInPicture&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The catalog is curated, not exhaustive. If your browser ships an API that isn't there, the side panel will surface it - click "Copy as markdown" to drop the list into an issue. PRs welcome — adding a demo is literally one file in src/demos/. &lt;a href="https://github.com/hmelenok/browser-api-atlas/discussions" rel="noopener noreferrer"&gt;GitHub Discussions&lt;/a&gt; is the best place to talk through ideas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Also !IMPORTANT Note&lt;/strong&gt; - Honest disclosure: this project was built in close collaboration with an AI coding agent. I drove the design, taste, and ship calls;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>browser</category>
      <category>javascript</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
