<!DOCTYPE html>
<html lang="en">
  <head>
    <!-- These meta tags come first. -->
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />

    <title>TODO</title>
    <link rel="stylesheet" href="./index.css">
  </head>
  <body>
    <div class="indicator">Loading</div>
    <webview
      id="todo-app"
      src="http://0.0.0.0:3000/"
      nodeintegration>
    </webview>

    <script>
     (() => {
       console.log("===> starting");
       const fs = require('fs');

       const webview = document.getElementById('todo-app')
       const indicator = document.querySelector('.indicator')

       console.log("===> webview is: ", webview);

       webview.addEventListener('did-stop-loading', () => {
         console.log("==> did-stop-loading");
         indicator.classList.add('hide');
       })

       webview.addEventListener('ipc-message', (event) => {
         console.log("===> reveived ipc-message");
         console.log(event.channel)
         // Prints "pong"
       })

       webview.addEventListener("dom-ready", function() {
         webview.openDevTools();
       });
      })();
    </script>
  </body>
</html>

<!DOCTYPE html>
<html lang="en">
  <head>
    <!-- These meta tags come first. -->
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />

    <title>TODO</title>
    <link rel="stylesheet" href="./index.css">
  </head>
  <body>
    <div class="indicator">Loading</div>
    <webview
      id="todo-app"
      src="http://localhost:3000/"
      nodeintegration>
    </webview>

    <script>
     (() => {
       console.log("===> starting");
       const fs = require('fs');

       const webview = document.getElementById('todo-app')
       const indicator = document.querySelector('.indicator')

       console.log("===> webview is: ", webview);

       webview.addEventListener('did-stop-loading', () => {
         console.log("==> did-stop-loading");
         indicator.classList.add('hide');
       })

       webview.addEventListener('ipc-message', (event) => {
         console.log("===> reveived ipc-message");
         console.log(event.channel)
         // Prints "pong"
       })

       webview.addEventListener("dom-ready", function() {
         webview.openDevTools();
       });
      })();
    </script>
  </body>
</html>

Use localhost and not 0.0.0.0 for webview url
Use localhost and not 0.0.0.0 for webview url

both locahost and 0.0.0.0 work on Apple OSX
but only localhost works on windows so use that
