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