It looks like this is a web page, not a feed. I looked for a feed associated with this page, but couldn't find one. Please enter the address of your feed to validate.

Source: https://nwabs-organization.gitbook.io/seopack/

  1. <!DOCTYPE html><html lang="en" class="notranslate" translate="no"><head>
  2.    <meta charset="UTF-8">
  3.    <meta name="viewport" content="width=device-width, initial-scale=1.0">
  4.    <title>GitBook</title>
  5.    <link rel="manifest" href="/public/manifest.json">
  6.    <link rel="icon" sizes="512x512" href="/public/images/icon-512.png" media="(prefers-color-scheme: light)">
  7.    <link rel="icon" sizes="512x512" href="/public/images/icon-512-dark.png" media="(prefers-color-scheme: dark)">
  8.    <link rel="apple-touch-icon" sizes="512x512" href="/public/images/icon-ios/icon_512x512.png">
  9.    <link rel="apple-touch-icon" sizes="512x512@2x" href="/public/images/icon-ios/icon_512x512@2x.png">
  10.    <meta name="apple-mobile-web-app-status-bar-style" content="default">
  11.    <meta name="apple-mobile-web-app-title" content="GitBook">
  12.    <meta name="theme-color" content="#f7f7f7">
  13.    <meta name="description" content="GitBook">
  14.    <link rel="preconnect" href="https://v2-content.gitbook.com">
  15.    <script type="text/javascript" defer="" src="https://cdn.iframe.ly/embed.js" async=""></script>
  16.    <!--
  17.      Google Tag Manager tracking script to track conversions from the site.
  18.      See https://gitbook.slack.com/archives/C07AQA4256G/p1721923712258389 for more info
  19.    -->
  20.    <script>
  21.      (function (w, d, s, l, i) {
  22.          w[l] = w[l] || [];
  23.          w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' });
  24.          var f = d.getElementsByTagName(s)[0],
  25.              j = d.createElement(s),
  26.              dl = l != 'dataLayer' ? '&l=' + l : '';
  27.          j.async = true;
  28.          j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
  29.          f.parentNode.insertBefore(j, f);
  30.      })(window, document, 'script', 'dataLayer', 'GTM-PVD2ZHVC');
  31.  </script>
  32.    <script>
  33.          (async function() {
  34.          // Splash screen modifications
  35.          
  36.          // 1. Adapt to dark/light theme
  37.          const theme = localStorage.getItem('@recoil/userThemeAtom');
  38.          if (theme?.includes('dark')) {
  39.            document.documentElement.classList.add('theme-color-dark');
  40.          } else if (theme?.includes('light')) {
  41.            document.documentElement.classList.add('theme-color-light');
  42.          }
  43.          
  44.          function hideSidebar() {
  45.              const sidebar = document.querySelector('.sidebar');
  46.              if (sidebar) sidebar.style.display = 'none';
  47.          }
  48.          
  49.          function applySidebarSizing() {
  50.              let sidebarWidth;
  51.              let isSidebarCollapsed = false;
  52.  
  53.              function applySidebarWidth() {
  54.                  const sidebar = document.querySelector('.sidebar');
  55.                  if (!sidebar) return;
  56.                  
  57.                  if (isSidebarCollapsed) {
  58.                      sidebar.style.setProperty('--sidebar-width', '0px')
  59.                  } else if (sidebarWidth) {
  60.                      sidebar.style.setProperty('--sidebar-width', sidebarWidth + 'px');
  61.                  }
  62.              }
  63.  
  64.              try {
  65.                  const dbName = 'keyval-store';
  66.                  const storeName = 'keyval';
  67.                  const request = indexedDB.open(dbName, 1);
  68.  
  69.                  request.onupgradeneeded = (event) => {
  70.                      const db = event.target.result;
  71.                      if (!db.objectStoreNames.contains(storeName)) {
  72.                          db.createObjectStore(storeName);
  73.                      }
  74.                  };
  75.  
  76.                  request.onsuccess = (event) => {
  77.                      const db = event.target.result;
  78.                      if (db.objectStoreNames.contains(storeName)) {
  79.                          const transaction = db.transaction(storeName, 'readonly');
  80.                          const store = transaction.objectStore(storeName);
  81.  
  82.                          const widthRequest = store.get('@recoil/sidebarWidth');
  83.                          widthRequest.onsuccess = () => {
  84.                              if (widthRequest.result !== undefined) {
  85.                                  sidebarWidth = widthRequest.result;
  86.                              }
  87.                              const collapsedRequest = store.get('@recoil/sidebarCollapsed');
  88.                              collapsedRequest.onsuccess = () => {
  89.                                  if (collapsedRequest.result !== undefined) {
  90.                                      isSidebarCollapsed = collapsedRequest.result;
  91.                                  }
  92.                                  applySidebarWidth();
  93.                              };
  94.                          };
  95.                      } else {
  96.                          applySidebarWidth();
  97.                      }
  98.                  };
  99.  
  100.                  request.onerror = () => {
  101.                      applySidebarWidth();
  102.                  };
  103.  
  104.              } catch (e) {
  105.                  applySidebarWidth();
  106.              }
  107.          }
  108.          
  109.          // Leave early if no indexedDB
  110.          if (!('indexedDB' in window)) {
  111.              hideSidebar();
  112.              return;
  113.          }
  114.        
  115.        const path = window.location.pathname;
  116.        const urlParams = new URLSearchParams(window.location.search);
  117.        const hasAuthToken = urlParams.has('auth_token');
  118.        
  119.        // Detect SAML auth flows (auth_token without apiTestMode) to skip problematic Firebase checks
  120.        const isSamlAuth = hasAuthToken && !urlParams.has('apiTestMode');
  121.        
  122.        // 2. Check auth state. Sign-in page layout doesn't match editor, so we need to hide the sidebar there. Skip Firebase auth checks for SAML flows to avoid race conditions in CI
  123.        if (!isSamlAuth) {
  124.            let authCheckTimeout;
  125.            try {
  126.                const firebaseDbName = 'firebaseLocalStorageDb';
  127.                const firebaseRequest = indexedDB.open(firebaseDbName, 1);
  128.  
  129.                // Add timeout to prevent blocking page render in CI
  130.                authCheckTimeout = setTimeout(() => {
  131.                    hideSidebar();
  132.                }, 1000);
  133.  
  134.                firebaseRequest.onsuccess = (event) => {
  135.                    if (authCheckTimeout !== undefined) {
  136.                        clearTimeout(authCheckTimeout);
  137.                        authCheckTimeout = undefined;
  138.                    }
  139.                    const db = event.target.result;
  140.                    const objectStoreNames = Array.from(db.objectStoreNames);
  141.                    
  142.                    if (!objectStoreNames.length) {
  143.                        return hideSidebar();
  144.                    }
  145.                    
  146.                    const transaction = db.transaction(objectStoreNames, 'readonly');
  147.                    const store = transaction.objectStore(objectStoreNames[0]);
  148.                    
  149.                    // Look for Firebase auth user key pattern
  150.                    const getAllRequest = store.getAllKeys();
  151.                    getAllRequest.onsuccess = () => {
  152.                    const keys = getAllRequest.result;
  153.                    const authKey = keys.find(key =>
  154.                        typeof key === 'string' &&
  155.                        key.includes('firebase:authUser:') &&
  156.                        key.includes('[DEFAULT]')
  157.                    );
  158.                    
  159.                    if (!authKey) {
  160.                        return hideSidebar();
  161.                    }
  162.                    
  163.                    // Check if the auth user actually has data
  164.                    const getRequest = store.get(authKey);
  165.                    getRequest.onsuccess = () => {
  166.                        if (!getRequest.result) {
  167.                            return hideSidebar();
  168.                        }
  169.                    // At this point, user is logged in. Apply sidebar width/collapsed logic.
  170.                    applySidebarSizing();
  171.                    };
  172.                    };
  173.                };
  174.  
  175.                firebaseRequest.onerror = () => {
  176.                    if (authCheckTimeout !== undefined) {
  177.                        clearTimeout(authCheckTimeout);
  178.                        authCheckTimeout = undefined;
  179.                    }
  180.                    hideSidebar();
  181.                };
  182.            } catch (e) {
  183.                if (authCheckTimeout !== undefined) {
  184.                    clearTimeout(authCheckTimeout);
  185.                    authCheckTimeout = undefined;
  186.                }
  187.                hideSidebar();
  188.            }
  189.        } else {
  190.            // For SAML auth flows, still apply sidebar sizing but skip Firebase auth checks
  191.            // This ensures SAML users get their sidebar preferences without CI race conditions
  192.            applySidebarSizing();
  193.        }
  194.  
  195.        // Adds header nav bars (Space, OpenAPI, Site, Integration detail page)
  196.        const pagesWithHeader = ['/openapi/', '/s/', '/site', '/integrations/'];
  197.        const showSpaceheader = pagesWithHeader.some(route => path.includes(route));
  198.        
  199.        if (showSpaceheader) {
  200.            document.documentElement.classList.add('show-spaceheader');
  201.        }
  202.    })();
  203.    </script>
  204.  <link rel="stylesheet" href="/public/dist/index-VBWOQRL2.css"></head>
  205.  <body>
  206.    <!-- Google Tag Manager -->
  207.    <noscript>
  208.      <iframe src="https://www.googletagmanager.com/ns.html?id=GTM-PVD2ZHVC" height="0" width="0" style="display:none;visibility:hidden"></iframe>
  209.    </noscript>
  210.  
  211.    <div id="root" class="app-root-container">
  212.        <div id="gitbook-root" class="app-root"></div>
  213.        <div id="portals-root"></div>
  214.    </div>
  215.    <div class="gitbook-splashscreen">
  216.      <div class="sidebar">
  217.        <div class="sidebar-header-skeleton">
  218.            <div class="org-switcher-skeleton shimmer-dark"></div>
  219.        </div>
  220.      </div>
  221.      <div class="application">
  222.        <div class="spaceheader"></div>
  223.      </div>
  224.    </div>
  225.  
  226.  
  227.  
  228. <script src="/public/dist/index-5SEFLJWQ.min.js" type="module"></script></body></html>
Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda