CINXE.COM

Interline Technologies (Page 1) - Interline Technologies

<!DOCTYPE html> <html lang="en" data-color-scheme="system" class="scroll-smooth"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Interline Technologies (Page 1) - Interline Technologies</title> <meta name="HandheldFriendly" content="True" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="theme-color" content="#F3A556"> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preload stylesheet" href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@300..800&display=swap" as="style" onload="this.onload=null;this.rel='stylesheet'" crossorigin> <style>body { --font-headings: 'DM Sans', sans-serif; }</style> <style>body { --font-body: 'DM Sans', sans-serif; }</style> <script type="module" src="https://www.interline.io/assets/built/app.js?v=18db3c6aae"></script> <link rel="stylesheet" type="text/css" href="https://www.interline.io/assets/built/app.css?v=18db3c6aae" /> <script> let preferredTheme = localStorage.getItem('PREFERRED_COLOR_SCHEME') || `system`; document.documentElement.setAttribute('data-color-scheme', preferredTheme); // Global values needed const themeGlobal = { siteUrl: 'https://www.interline.io', currentPage: parseInt('1'), nextPage: parseInt('2'), nextPageLink: '', maxPages: parseInt('3'), lastPage: `1` === `3` ? true : false, postsPerPage: parseInt('12'), total: parseInt('29'), searchJobsFeaturedFirst: false } function hexToRgb(hexColor) { if (hexColor.slice(0, 1) === '#') { hexColor = hexColor.slice(1); } if (hexColor.length === 3) { hexColor = hexColor.split('').map(function (hex) { return hex + hex;}).join(''); } const r = parseInt(hexColor.substr(0,2),16); const g = parseInt(hexColor.substr(2,2),16); const b = parseInt(hexColor.substr(4,2),16); return [r,g,b] } // Get contrast color; function getColorContrast(hexColor) { const rgb = hexToRgb(hexColor); let yiq = ((rgb[0] * 299) + (rgb[1] * 587) + (rgb[2] * 114)) / 1000; const colorContrast = (yiq >= 128) ? 'hsl(0 0% 0%)' : 'hsl(0 0% 100%)'; // return return colorContrast }; function hexToHsl(hexColor) { const rgb = hexToRgb(hexColor); // Make r, g, and b fractions of 1 const r = rgb[0]/255; const g = rgb[1]/255; const b = rgb[2]/255; const max = Math.max(r, g, b), min = Math.min(r, g, b); let h, s, l = (max + min) / 2; if ( max == min ) { h = s = 0; } else { let d = max - min; s = l > 0.5 ? d / (2 - max - min) : d / (max + min); switch(max){ case r: h = (g - b) / d + (g < b ? 6 : 0); break; case g: h = (b - r) / d + 2; break; case b: h = (r - g) / d + 4; break; } h /= 6; } return [Math.round(h * 360),Math.round(s * 100),Math.round(l * 100)] } function setBrandHSL(hex) { const colorHsl = hexToHsl(hex) document.documentElement.style.setProperty('--color-brand-hsl', `${colorHsl[0]} ${colorHsl[1]}% ${colorHsl[2]}%`); document.documentElement.style.setProperty('--color-brand-contrast', getColorContrast(hex)); } setBrandHSL("#F3A556"); </script> <link rel="icon" href="https://www.interline.io/content/images/2024/09/favicon.ico" type="image/x-icon"> <link rel="canonical" href="https://www.interline.io/blog/"> <meta name="referrer" content="no-referrer-when-downgrade"> <link rel="next" href="https://www.interline.io/blog/page/2/"> <meta property="og:site_name" content="Interline Technologies"> <meta property="og:type" content="website"> <meta property="og:title" content="Interline Technologies (Page 1)"> <meta property="og:url" content="https://www.interline.io/blog/"> <meta name="twitter:card" content="summary"> <meta name="twitter:title" content="Interline Technologies (Page 1)"> <meta name="twitter:url" content="https://www.interline.io/blog/"> <meta name="generator" content="Ghost 5.109"> <link rel="alternate" type="application/rss+xml" title="Interline Technologies" href="https://www.interline.io/blog/rss/"> <script defer src="https://cdn.jsdelivr.net/ghost/sodo-search@~1.5/umd/sodo-search.min.js" data-key="7afadadffdaf89f0b9d751f7f4" data-styles="https://cdn.jsdelivr.net/ghost/sodo-search@~1.5/umd/main.css" data-sodo-search="https://interline.ghost.io/" data-locale="en" crossorigin="anonymous"></script> <link href="https://www.interline.io/webmentions/receive/" rel="webmention"> <script defer src="/public/cards.min.js?v=18db3c6aae"></script><style>:root {--ghost-accent-color: #F3A556;}</style> <link rel="stylesheet" type="text/css" href="/public/cards.min.css?v=18db3c6aae"> <meta name="fediverse:creator" content="@interline@mastodon.social"> <script defer data-domain="interline.io" src="https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js"></script> <script>window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) }</script> <style> footer .is-subitem { margin-left: 1.25em !important; font-weight: lighter !important; } /* remove backticks in blog posts */ .ghost-content code:before, .ghost-content code:after { display: none; } </style> <link rel="preconnect" href="https://fonts.bunny.net"><link rel="stylesheet" href="https://fonts.bunny.net/css?family=ibm-plex-serif:400,500,600"><style>:root {--gh-font-heading: IBM Plex Serif;}</style> </head> <body class="gh-font-heading-ibm-plex-serif subpixel-antialiased relative overflow-x-hidden bg-bgr text-typ" x-data="{ menuOpen: false }" :class="menuOpen ? 'overflow-hidden' : 'overflow-y-auto'" data-user="visitor" @keydown.escape="menuOpen = false" @keydown.cmk.k="document.querySelector('[data-ghost-search]').click()" x-init="navigator.platform.includes('Win') && document.body.classList.add('is-win')" > <header class="px-4 sm:px-6 text-typ whitespace-nowrap sticky top-0 z-[1000] bg-bgr lg:bg-transparent" data-header x-init="renderSubmenus();window.pageYOffset > 50 ? isScrolledOnload = true : null" x-data="{ isScrolled: false, isScrolledOnload: false }" @scroll.window="isScrolled = (window.pageYOffset < 50) ? false : true;window.pageYOffset <= 50 ? isScrolledOnload = false : null" :class="[isScrolled ? 'is-scrolled' : '',isScrolledOnload ? 'is-scrolled-onload' : '']"> <div class="max-w-container mx-auto py-4 md:py-6 flex items-center justify-center gap-4 relative before:content-[''] before:absolute before:bottom-0 before:left-0 before:w-full before:h-[1px] before:bg-fading"> <div class="flex-1 flex justify-start lg:transition-move duration-300" data-header-brand> <a class="" href="https://www.interline.io" data-brand> <picture data-logo='dark'> <source srcset="/content/images/size/w100/format/webp/2024/11/interline-logo-white-on-transparent-2.png 100w, /content/images/size/w320/format/webp/2024/11/interline-logo-white-on-transparent-2.png 320w, /content/images/size/w640/format/webp/2024/11/interline-logo-white-on-transparent-2.png 600w" sizes="(max-width: 800px) 200px, 320px" type="image/webp" > <img class="h-[var(--logo-h-mobile)] w-[var(--logo-w-mobile)] md:h-[var(--logo-h-desktop)] md:w-[var(--logo-w-desktop)]" loading="eager" srcset="/content/images/size/w100/format/webp/2024/11/interline-logo-white-on-transparent-2.png 100w, /content/images/size/w320/format/webp/2024/11/interline-logo-white-on-transparent-2.png 320w, /content/images/size/w640/format/webp/2024/11/interline-logo-white-on-transparent-2.png 600w" sizes="(max-width: 800px) 200px, 320px" src="/content/images/size/w30/2024/11/interline-logo-white-on-transparent-2.png" alt="Interline Technologies" /> </picture> <picture data-logo='default'> <source srcset="/content/images/size/w100/format/webp/2023/10/Interline-logo-full-1.png 100w, /content/images/size/w320/format/webp/2023/10/Interline-logo-full-1.png 320w, /content/images/size/w640/format/webp/2023/10/Interline-logo-full-1.png 600w" sizes="(max-width: 800px) 200px, 320px" type="image/webp" > <img class="h-[var(--logo-h-mobile)] w-[var(--logo-w-mobile)] md:h-[var(--logo-h-desktop)] md:w-[var(--logo-w-desktop)]" loading="eager" srcset="/content/images/size/w100/format/webp/2023/10/Interline-logo-full-1.png 100w, /content/images/size/w320/format/webp/2023/10/Interline-logo-full-1.png 320w, /content/images/size/w640/format/webp/2023/10/Interline-logo-full-1.png 600w" sizes="(max-width: 800px) 200px, 320px" src="/content/images/size/w30/2023/10/Interline-logo-full-1.png" alt="Interline Technologies" /> </picture> </a> </div> <nav class="relative hidden transition-[width,filter] duration-300 text-sm lg:flex justify-center p-1 border border-brd rounded-theme-lg bg-bgr-opac backdrop-blur" data-nav="desktop" :class="isScrolled ? 'drop-shadow-xl' : ''"> <ul class="flex gap-0.5"> <li class="nav-transitland-platform flex relative border border-transparent hover:bg-bgr-tone rounded-theme" data-label="Transitland Platform" data-slug="transitland-platform" data-length="20"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/transitland/" > <span>Transitland Platform</span> </a> </li> <li class="nav-intro-to-transitland flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Intro to Transitland" data-slug="intro-to-transitland" data-length="22"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/transitland/" > <span>- Intro to Transitland</span> </a> </li> <li class="nav-transitland-apis-for-developers flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Transitland APIs for Developers" data-slug="transitland-apis-for-developers" data-length="33"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/transitland/apis-for-developers/" > <span>- Transitland APIs for Developers</span> </a> </li> <li class="nav-custom-bulk-transit-data-exports flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Custom Bulk Transit Data Exports" data-slug="custom-bulk-transit-data-exports" data-length="34"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/transitland/custom-bulk-transit-data/" > <span>- Custom Bulk Transit Data Exports</span> </a> </li> <li class="nav-all-stops-in-the-united-states flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- All Stops in the United States" data-slug="all-stops-in-the-united-states" data-length="32"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/transitland/all-us-stops-bulk-data/" > <span>- All Stops in the United States</span> </a> </li> <li class="nav-compare-transitland flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Compare Transitland" data-slug="compare-transitland" data-length="21"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/transitland/compare/" > <span>- Compare Transitland</span> </a> </li> <li class="nav-transitland-plans-pricing flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Transitland Plans &amp; Pricing" data-slug="transitland-plans-pricing" data-length="30"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.transit.land/plans-pricing/" > <span>- Transitland Plans &amp; Pricing</span> </a> </li> <li class="nav-interline-routing-platform flex relative border border-transparent hover:bg-bgr-tone rounded-theme" data-label="Interline Routing Platform" data-slug="interline-routing-platform" data-length="26"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/routing-platform/" > <span>Interline Routing Platform</span> </a> </li> <li class="nav-intro-to-valhalla flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Intro to Valhalla" data-slug="intro-to-valhalla" data-length="19"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/valhalla/" > <span>- Intro to Valhalla</span> </a> </li> <li class="nav-valhalla-tilepacks flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Valhalla Tilepacks" data-slug="valhalla-tilepacks" data-length="20"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/valhalla/tilepacks/" > <span>- Valhalla Tilepacks</span> </a> </li> <li class="nav-global-hosted-valhalla-apis flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Global Hosted Valhalla APIs" data-slug="global-hosted-valhalla-apis" data-length="29"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://rapidapi.com/interline-technologies-interline-technologies-default/api/interline-global-valhalla-navigation-and-routing-engine/" > <span>- Global Hosted Valhalla APIs</span> </a> </li> <li class="nav-transitland-routing-api flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Transitland Routing API" data-slug="transitland-routing-api" data-length="25"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.transit.land/documentation/routing-api/" > <span>- Transitland Routing API</span> </a> </li> <li class="nav-resources flex relative border border-transparent hover:bg-bgr-tone rounded-theme" data-label="Resources" data-slug="resources" data-length="9"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/resources/" > <span>Resources</span> </a> </li> <li class="nav-blog nav-current flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Blog" data-slug="blog" data-length="6"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/blog/" > <span>- Blog</span> </a> </li> <li class="nav-consulting flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Consulting" data-slug="consulting" data-length="12"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/consulting/" > <span>- Consulting</span> </a> </li> <li class="nav-applied-research flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- Applied Research" data-slug="applied-research" data-length="18"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/resources/applied-research/" > <span>- Applied Research</span> </a> </li> <li class="nav-osm-extracts flex relative border border-transparent hover:bg-bgr-tone rounded-theme is-subitem" data-label="- OSM Extracts" data-slug="osm-extracts" data-length="14"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://app.interline.io/osm_extracts/interactive_view" > <span>- OSM Extracts</span> </a> </li> <li class="nav-about-interline flex relative border border-transparent hover:bg-bgr-tone rounded-theme" data-label="About Interline" data-slug="about-interline" data-length="15"> <a class="w-full flex px-4 py-1.5 rounded-theme" href="https://www.interline.io/about/" > <span>About Interline</span> </a> </li> </ul> </nav> <div class="flex flex-0 sm:flex-1 gap-2 items-center justify-end transition-move duration-300" data-header-actions> <button class="flex flex-col gap-1.5 size-8 md:size-9 items-center justify-center rounded-theme group hover:text-brand lg:hidden" data-menu-toggle aria-label="Menu toggle" aria-expanded="false" aria-haspopup="true" aria-controls="menu" @click="menuOpen = !menuOpen; event.currentTarget.setAttribute('aria-expanded', menuOpen);" > <span class="relative pointer-events-none w-5 h-0.5 rounded-sm bg-typ-tone group-hover:bg-brand transition-all" :class="menuOpen ? 'rotate-45 top-1' : 'rotate-0 top-0'"></span> <span class="relative pointer-events-none w-5 h-0.5 rounded-sm bg-typ-tone group-hover:bg-brand transition-all" :class="menuOpen ? '-rotate-45 -top-1' : ''"></span> </button> </div> </div> </header> <div class="fixed shadow-xl z-[100] top-[64px] md:top-[84px] w-full bg-bgr text-typ-tone pt-4 border-t border-brd lg:hidden fixed" :class="menuOpen ? 'block' : 'hidden'" data-menu id="menu" > <div class="px-4 sm:px-6"> <nav class="" data-nav="mobile"> <ul class="flex flex-col gap-1"> <li class="nav-transitland-platform flex relative" data-label="Transitland Platform" data-slug="transitland-platform" data-length="20"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/transitland/" > <span>Transitland Platform</span> </a> </li> <li class="nav-intro-to-transitland flex relative is-subitem" data-label="- Intro to Transitland" data-slug="intro-to-transitland" data-length="22"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/transitland/" > <span>- Intro to Transitland</span> </a> </li> <li class="nav-transitland-apis-for-developers flex relative is-subitem" data-label="- Transitland APIs for Developers" data-slug="transitland-apis-for-developers" data-length="33"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/transitland/apis-for-developers/" > <span>- Transitland APIs for Developers</span> </a> </li> <li class="nav-custom-bulk-transit-data-exports flex relative is-subitem" data-label="- Custom Bulk Transit Data Exports" data-slug="custom-bulk-transit-data-exports" data-length="34"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/transitland/custom-bulk-transit-data/" > <span>- Custom Bulk Transit Data Exports</span> </a> </li> <li class="nav-all-stops-in-the-united-states flex relative is-subitem" data-label="- All Stops in the United States" data-slug="all-stops-in-the-united-states" data-length="32"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/transitland/all-us-stops-bulk-data/" > <span>- All Stops in the United States</span> </a> </li> <li class="nav-compare-transitland flex relative is-subitem" data-label="- Compare Transitland" data-slug="compare-transitland" data-length="21"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/transitland/compare/" > <span>- Compare Transitland</span> </a> </li> <li class="nav-transitland-plans-pricing flex relative is-subitem" data-label="- Transitland Plans &amp; Pricing" data-slug="transitland-plans-pricing" data-length="30"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.transit.land/plans-pricing/" > <span>- Transitland Plans &amp; Pricing</span> </a> </li> <li class="nav-interline-routing-platform flex relative" data-label="Interline Routing Platform" data-slug="interline-routing-platform" data-length="26"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/routing-platform/" > <span>Interline Routing Platform</span> </a> </li> <li class="nav-intro-to-valhalla flex relative is-subitem" data-label="- Intro to Valhalla" data-slug="intro-to-valhalla" data-length="19"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/valhalla/" > <span>- Intro to Valhalla</span> </a> </li> <li class="nav-valhalla-tilepacks flex relative is-subitem" data-label="- Valhalla Tilepacks" data-slug="valhalla-tilepacks" data-length="20"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/valhalla/tilepacks/" > <span>- Valhalla Tilepacks</span> </a> </li> <li class="nav-global-hosted-valhalla-apis flex relative is-subitem" data-label="- Global Hosted Valhalla APIs" data-slug="global-hosted-valhalla-apis" data-length="29"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://rapidapi.com/interline-technologies-interline-technologies-default/api/interline-global-valhalla-navigation-and-routing-engine/" > <span>- Global Hosted Valhalla APIs</span> </a> </li> <li class="nav-transitland-routing-api flex relative is-subitem" data-label="- Transitland Routing API" data-slug="transitland-routing-api" data-length="25"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.transit.land/documentation/routing-api/" > <span>- Transitland Routing API</span> </a> </li> <li class="nav-resources flex relative" data-label="Resources" data-slug="resources" data-length="9"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/resources/" > <span>Resources</span> </a> </li> <li class="nav-blog nav-current flex relative is-subitem" data-label="- Blog" data-slug="blog" data-length="6"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/blog/" > <span>- Blog</span> </a> </li> <li class="nav-consulting flex relative is-subitem" data-label="- Consulting" data-slug="consulting" data-length="12"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/consulting/" > <span>- Consulting</span> </a> </li> <li class="nav-applied-research flex relative is-subitem" data-label="- Applied Research" data-slug="applied-research" data-length="18"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/resources/applied-research/" > <span>- Applied Research</span> </a> </li> <li class="nav-osm-extracts flex relative is-subitem" data-label="- OSM Extracts" data-slug="osm-extracts" data-length="14"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://app.interline.io/osm_extracts/interactive_view" > <span>- OSM Extracts</span> </a> </li> <li class="nav-about-interline flex relative" data-label="About Interline" data-slug="about-interline" data-length="15"> <a class="flex py-0.5 rounded-theme hover:text-brand" href="https://www.interline.io/about/" > <span>About Interline</span> </a> </li> </ul> </nav> </div> <div class="p-4 mt-4 flex gap-2 border-y border-brd"> <button class="flex gap-0.5 p-[3px] border border-brd text-typ-tone rounded-theme hover:bg-bgr-tone" aria-label="Toggle color scheme" data-color-scheme-toggle @click="toggleColorScheme(event)"> <span data-theme="light" class="px-[5px] py-0.5 border border-transparent opacity-50 rounded-theme"> <i class="icon icon-sun size-4 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-sun-filled" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <path d="M12 19a1 1 0 0 1 .993 .883l.007 .117v1a1 1 0 0 1 -1.993 .117l-.007 -.117v-1a1 1 0 0 1 1 -1z" stroke-width="0" fill="currentColor" /> <path d="M18.313 16.91l.094 .083l.7 .7a1 1 0 0 1 -1.32 1.497l-.094 -.083l-.7 -.7a1 1 0 0 1 1.218 -1.567l.102 .07z" stroke-width="0" fill="currentColor" /> <path d="M7.007 16.993a1 1 0 0 1 .083 1.32l-.083 .094l-.7 .7a1 1 0 0 1 -1.497 -1.32l.083 -.094l.7 -.7a1 1 0 0 1 1.414 0z" stroke-width="0" fill="currentColor" /> <path d="M4 11a1 1 0 0 1 .117 1.993l-.117 .007h-1a1 1 0 0 1 -.117 -1.993l.117 -.007h1z" stroke-width="0" fill="currentColor" /> <path d="M21 11a1 1 0 0 1 .117 1.993l-.117 .007h-1a1 1 0 0 1 -.117 -1.993l.117 -.007h1z" stroke-width="0" fill="currentColor" /> <path d="M6.213 4.81l.094 .083l.7 .7a1 1 0 0 1 -1.32 1.497l-.094 -.083l-.7 -.7a1 1 0 0 1 1.217 -1.567l.102 .07z" stroke-width="0" fill="currentColor" /> <path d="M19.107 4.893a1 1 0 0 1 .083 1.32l-.083 .094l-.7 .7a1 1 0 0 1 -1.497 -1.32l.083 -.094l.7 -.7a1 1 0 0 1 1.414 0z" stroke-width="0" fill="currentColor" /> <path d="M12 2a1 1 0 0 1 .993 .883l.007 .117v1a1 1 0 0 1 -1.993 .117l-.007 -.117v-1a1 1 0 0 1 1 -1z" stroke-width="0" fill="currentColor" /> <path d="M12 7a5 5 0 1 1 -4.995 5.217l-.005 -.217l.005 -.217a5 5 0 0 1 4.995 -4.783z" stroke-width="0" fill="currentColor" /> </svg> </i> </span> <span data-theme="dark" class="px-[5px] py-0.5 border border-transparent opacity-50 rounded-theme"> <i class="icon icon-moon size-4 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-moon-filled" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <path d="M12 1.992a10 10 0 1 0 9.236 13.838c.341 -.82 -.476 -1.644 -1.298 -1.31a6.5 6.5 0 0 1 -6.864 -10.787l.077 -.08c.551 -.63 .113 -1.653 -.758 -1.653h-.266l-.068 -.006l-.06 -.002z" stroke-width="0" fill="currentColor" /> </svg> </i> </span> </button> </div> </div> <main class="main"> <section class="px-4 sm:px-6 mt-16" data-featured-tags> <div class="max-w-container mx-auto"> <nav class="mb-6" data-featured-tags x-init="$nextTick(() => { handleTagList() })"> <ul role="list" class="text-sm text-typ-tone font-medium flex gap-1 overflow-x-scroll no-scrollbar border-b border-brd pb-2.5"> <li> <a href="/blog" class="relative block text-nowrap px-3 py-1 border border-transparent rounded-theme after:content-[''] after:absolute after:bottom-[-11px] after:left-[calc(50%_-_16px)] after:w-8 after:h-0.5 after:rounded-t-sm after:bg-transparent hover:bg-bgr-tone">All posts</a> </li> <li> <a href="/blog/tag/about-interline/" class="relative block text-nowrap px-3 py-1 border border-transparent rounded-theme md:px-4 after:content-[''] after:absolute after:bottom-[-11px] after:left-[calc(50%_-_16px)] after:w-8 after:h-0.5 after:rounded-t-sm after:bg-transparent hover:bg-bgr-tone"> About Interline </a> </li> <li> <a href="/blog/tag/transitland/" class="relative block text-nowrap px-3 py-1 border border-transparent rounded-theme md:px-4 after:content-[''] after:absolute after:bottom-[-11px] after:left-[calc(50%_-_16px)] after:w-8 after:h-0.5 after:rounded-t-sm after:bg-transparent hover:bg-bgr-tone"> Transitland </a> </li> <li> <a href="/blog/tag/gtfs/" class="relative block text-nowrap px-3 py-1 border border-transparent rounded-theme md:px-4 after:content-[''] after:absolute after:bottom-[-11px] after:left-[calc(50%_-_16px)] after:w-8 after:h-0.5 after:rounded-t-sm after:bg-transparent hover:bg-bgr-tone"> GTFS </a> </li> <li> <a href="/blog/tag/511-sf-bay-regional-feed/" class="relative block text-nowrap px-3 py-1 border border-transparent rounded-theme md:px-4 after:content-[''] after:absolute after:bottom-[-11px] after:left-[calc(50%_-_16px)] after:w-8 after:h-0.5 after:rounded-t-sm after:bg-transparent hover:bg-bgr-tone"> 511.org SF Bay Regional Feed </a> </li> <li> <a href="/blog/tag/openstreetmap/" class="relative block text-nowrap px-3 py-1 border border-transparent rounded-theme md:px-4 after:content-[''] after:absolute after:bottom-[-11px] after:left-[calc(50%_-_16px)] after:w-8 after:h-0.5 after:rounded-t-sm after:bg-transparent hover:bg-bgr-tone"> OpenStreetMap </a> </li> <li> <a href="/blog/tag/geojsonl/" class="relative block text-nowrap px-3 py-1 border border-transparent rounded-theme md:px-4 after:content-[''] after:absolute after:bottom-[-11px] after:left-[calc(50%_-_16px)] after:w-8 after:h-0.5 after:rounded-t-sm after:bg-transparent hover:bg-bgr-tone"> GeoJSONL </a> </li> </ul> </nav> </div> </section> <section class="px-4 sm:px-6 mb-24" data-feed-section="12"> <div class="max-w-container mx-auto"> <h2 class="text-sm font-semibold uppercase text-typ-tone border-b border-brd mb-6 pb-2.5 sr-only"> Latest — page 1 </h2> <div class="grid gap-x-8 gap-y-12 sm:grid-cols-2 lg:grid-cols-3" data-post-feed> <article class="post tag-transitland relative text-typ-tone flex flex-col gap-4" data-post-card> <a href="/blog/built-with-transitland-instructables/" class="block"> <figure class="rounded-theme-xxs border border-brd overflow-hidden"> <picture > <source srcset="/content/images/size/w320/format/webp/2025/01/Screenshot-2025-01-10-at-09-28-24-NYC-Ferry-Schedule-Ticker-Clock-6-Steps--with-Pictures----Instructables.png 320w, /content/images/size/w640/format/webp/2025/01/Screenshot-2025-01-10-at-09-28-24-NYC-Ferry-Schedule-Ticker-Clock-6-Steps--with-Pictures----Instructables.png 600w, /content/images/size/w960/format/webp/2025/01/Screenshot-2025-01-10-at-09-28-24-NYC-Ferry-Schedule-Ticker-Clock-6-Steps--with-Pictures----Instructables.png 960w" sizes="(max-width: 400px) 300px, 400px" type="image/webp" > <img class="aspect-[16/9] bg-bgr-tone object-cover w-full h-auto rounded-[inherit] will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="/content/images/size/w320/format/webp/2025/01/Screenshot-2025-01-10-at-09-28-24-NYC-Ferry-Schedule-Ticker-Clock-6-Steps--with-Pictures----Instructables.png 320w, /content/images/size/w640/format/webp/2025/01/Screenshot-2025-01-10-at-09-28-24-NYC-Ferry-Schedule-Ticker-Clock-6-Steps--with-Pictures----Instructables.png 600w, /content/images/size/w960/format/webp/2025/01/Screenshot-2025-01-10-at-09-28-24-NYC-Ferry-Schedule-Ticker-Clock-6-Steps--with-Pictures----Instructables.png 960w" sizes="(max-width: 400px) 300px, 400px" src="/content/images/size/w30/2025/01/Screenshot-2025-01-10-at-09-28-24-NYC-Ferry-Schedule-Ticker-Clock-6-Steps--with-Pictures----Instructables.png" alt="screenshot of webpage titled &quot;NYC Ferry Schedule Ticker Clock&quot;" /> </picture> </figure> </a> <div class="flex h-full flex-col gap-2" data-post-card-content> <div class="flex items-center flex-wrap gap-2 text-sm" data-post-card-info> <a href="/blog/tag/transitland/" class="hover:text-brand">Transitland</a> <span class="">·</span> <time class="" datetime="2025-01-10">Jan 10, 2025</time> <span class="flex-1"></span> </div> <h3 class="text-typ text-lg sm:text-xl font-semibold hover:text-brand " data-post-card-title> <a href="/blog/built-with-transitland-instructables/" class="">Built with Transitland: Digital departures screen</a> </h3> <p class="font-light" data-post-card-excerpt> Want to build your own display to show when a bus, train, or ferry next departs? Here&#39;s a fun Instructables how-to guide. </p> <ul class="flex gap-3 text-sm font-medium mt-2" data-post-card-authors> <li> <a href="/blog/author/interline/" class="flex gap-1.5 items-center hover:text-brand"> <picture > <source srcset="/content/images/size/w30/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 30w, /content/images/size/w100/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 100w" sizes="24px" type="image/webp" > <img class="size-6 object-cover rounded-full will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="/content/images/size/w30/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 30w, /content/images/size/w100/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 100w" sizes="24px" src="/content/images/size/w30/2024/11/Interline-logo---symbol-only---large-padded.png" alt="" /> </picture> <span>Interline Technologies</span> </a> </li> </ul> </div> </article> <article class="post tag-events relative text-typ-tone flex flex-col gap-4" data-post-card> <a href="/blog/interline-at-trb-am-2025/" class="block"> <figure class="rounded-theme-xxs border border-brd overflow-hidden"> <picture > <source srcset="/content/images/size/w320/format/webp/2025/01/blue-slider-2025-TRB-annual-meeting-1260x468px.jpg 320w, /content/images/size/w640/format/webp/2025/01/blue-slider-2025-TRB-annual-meeting-1260x468px.jpg 600w, /content/images/size/w960/format/webp/2025/01/blue-slider-2025-TRB-annual-meeting-1260x468px.jpg 960w" sizes="(max-width: 400px) 300px, 400px" type="image/webp" > <img class="aspect-[16/9] bg-bgr-tone object-cover w-full h-auto rounded-[inherit] will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="/content/images/size/w320/format/webp/2025/01/blue-slider-2025-TRB-annual-meeting-1260x468px.jpg 320w, /content/images/size/w640/format/webp/2025/01/blue-slider-2025-TRB-annual-meeting-1260x468px.jpg 600w, /content/images/size/w960/format/webp/2025/01/blue-slider-2025-TRB-annual-meeting-1260x468px.jpg 960w" sizes="(max-width: 400px) 300px, 400px" src="/content/images/size/w30/2025/01/blue-slider-2025-TRB-annual-meeting-1260x468px.jpg" alt="Interline at TRB AM 2025" /> </picture> </figure> </a> <div class="flex h-full flex-col gap-2" data-post-card-content> <div class="flex items-center flex-wrap gap-2 text-sm" data-post-card-info> <a href="/blog/tag/events/" class="hover:text-brand">Events</a> <span class="">·</span> <time class="" datetime="2025-01-03">Jan 3, 2025</time> <span class="flex-1"></span> </div> <h3 class="text-typ text-lg sm:text-xl font-semibold hover:text-brand " data-post-card-title> <a href="/blog/interline-at-trb-am-2025/" class="">Interline at TRB AM 2025</a> </h3> <p class="font-light" data-post-card-excerpt> We&#39;ll be represented at the US Transportation Research Board Annual Meeting in Washington, D.C., by Interline principal </p> <ul class="flex gap-3 text-sm font-medium mt-2" data-post-card-authors> <li> <a href="/blog/author/interline/" class="flex gap-1.5 items-center hover:text-brand"> <picture > <source srcset="/content/images/size/w30/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 30w, /content/images/size/w100/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 100w" sizes="24px" type="image/webp" > <img class="size-6 object-cover rounded-full will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="/content/images/size/w30/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 30w, /content/images/size/w100/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 100w" sizes="24px" src="/content/images/size/w30/2024/11/Interline-logo---symbol-only---large-padded.png" alt="" /> </picture> <span>Interline Technologies</span> </a> </li> </ul> </div> </article> <article class="post tag-gtfs relative text-typ-tone flex flex-col gap-4" data-post-card> <a href="/blog/us-national-transit-database-releases-data-and-requests-more-feedback-2/" class="block"> <figure class="rounded-theme-xxs border border-brd overflow-hidden"> <picture > <source srcset="/content/images/size/w320/format/webp/2024/12/CleanShot-2024-12-24-at-14.58.25@2x.png 320w, /content/images/size/w640/format/webp/2024/12/CleanShot-2024-12-24-at-14.58.25@2x.png 600w, /content/images/size/w960/format/webp/2024/12/CleanShot-2024-12-24-at-14.58.25@2x.png 960w" sizes="(max-width: 400px) 300px, 400px" type="image/webp" > <img class="aspect-[16/9] bg-bgr-tone object-cover w-full h-auto rounded-[inherit] will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="/content/images/size/w320/format/webp/2024/12/CleanShot-2024-12-24-at-14.58.25@2x.png 320w, /content/images/size/w640/format/webp/2024/12/CleanShot-2024-12-24-at-14.58.25@2x.png 600w, /content/images/size/w960/format/webp/2024/12/CleanShot-2024-12-24-at-14.58.25@2x.png 960w" sizes="(max-width: 400px) 300px, 400px" src="/content/images/size/w30/2024/12/CleanShot-2024-12-24-at-14.58.25@2x.png" alt="US National Transit Database releases data and requests more feedback" /> </picture> </figure> </a> <div class="flex h-full flex-col gap-2" data-post-card-content> <div class="flex items-center flex-wrap gap-2 text-sm" data-post-card-info> <a href="/blog/tag/gtfs/" class="hover:text-brand">GTFS</a> <span class="">·</span> <time class="" datetime="2024-12-24">Dec 24, 2024</time> <span class="flex-1"></span> </div> <h3 class="text-typ text-lg sm:text-xl font-semibold hover:text-brand " data-post-card-title> <a href="/blog/us-national-transit-database-releases-data-and-requests-more-feedback-2/" class="">US National Transit Database releases data and requests more feedback</a> </h3> <p class="font-light" data-post-card-excerpt> Our recommendations to the US Federal Transit Administration regarding National Transit Database: Proposed Reporting Changes and Clarifications for Report Years 2025 and 2026. </p> <ul class="flex gap-3 text-sm font-medium mt-2" data-post-card-authors> <li> <a href="/blog/author/interline/" class="flex gap-1.5 items-center hover:text-brand"> <picture > <source srcset="/content/images/size/w30/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 30w, /content/images/size/w100/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 100w" sizes="24px" type="image/webp" > <img class="size-6 object-cover rounded-full will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="/content/images/size/w30/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 30w, /content/images/size/w100/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 100w" sizes="24px" src="/content/images/size/w30/2024/11/Interline-logo---symbol-only---large-padded.png" alt="" /> </picture> <span>Interline Technologies</span> </a> </li> </ul> </div> </article> <article class="post tag-transitland relative text-typ-tone flex flex-col gap-4" data-post-card> <a href="/blog/how-current-is-that-schedule/" class="block"> <figure class="rounded-theme-xxs border border-brd overflow-hidden"> <picture > <source srcset="/content/images/size/w320/format/webp/2024/11/unnamed--1--1-1.png 320w, /content/images/size/w640/format/webp/2024/11/unnamed--1--1-1.png 600w, /content/images/size/w960/format/webp/2024/11/unnamed--1--1-1.png 960w" sizes="(max-width: 400px) 300px, 400px" type="image/webp" > <img class="aspect-[16/9] bg-bgr-tone object-cover w-full h-auto rounded-[inherit] will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="/content/images/size/w320/format/webp/2024/11/unnamed--1--1-1.png 320w, /content/images/size/w640/format/webp/2024/11/unnamed--1--1-1.png 600w, /content/images/size/w960/format/webp/2024/11/unnamed--1--1-1.png 960w" sizes="(max-width: 400px) 300px, 400px" src="/content/images/size/w30/2024/11/unnamed--1--1-1.png" alt="How current is that schedule?" /> </picture> </figure> </a> <div class="flex h-full flex-col gap-2" data-post-card-content> <div class="flex items-center flex-wrap gap-2 text-sm" data-post-card-info> <a href="/blog/tag/transitland/" class="hover:text-brand">Transitland</a> <span class="">·</span> <time class="" datetime="2024-11-25">Nov 25, 2024</time> <span class="flex-1"></span> </div> <h3 class="text-typ text-lg sm:text-xl font-semibold hover:text-brand " data-post-card-title> <a href="/blog/how-current-is-that-schedule/" class="">How current is that schedule?</a> </h3> <p class="font-light" data-post-card-excerpt> The GTFS Best Practices guide recommends publishing data for the current data plus at least 7 days in the future. We&#39;ve used the Transitland archives to assess how many feeds meet this goal. </p> <ul class="flex gap-3 text-sm font-medium mt-2" data-post-card-authors> <li> <a href="/blog/author/ian/" class="flex gap-1.5 items-center hover:text-brand"> <picture > <source srcset="https://www.gravatar.com/avatar/d8835c97a93e99fdce8feb2c8bfe5a5b?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp 30w, https://www.gravatar.com/avatar/d8835c97a93e99fdce8feb2c8bfe5a5b?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp 100w" sizes="24px" type="image/webp" > <img class="size-6 object-cover rounded-full will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="https://www.gravatar.com/avatar/d8835c97a93e99fdce8feb2c8bfe5a5b?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp 30w, https://www.gravatar.com/avatar/d8835c97a93e99fdce8feb2c8bfe5a5b?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp 100w" sizes="24px" src="https://www.gravatar.com/avatar/d8835c97a93e99fdce8feb2c8bfe5a5b?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp" alt="" /> </picture> <span>Ian Rees</span> </a> </li> </ul> </div> </article> <article class="post tag-transitland relative text-typ-tone flex flex-col gap-4" data-post-card> <a href="/blog/giving-equal-prominence-to-buses-and-trains-on-the-map/" class="block"> <figure class="rounded-theme-xxs border border-brd overflow-hidden"> <picture > <source srcset="/content/images/size/w320/format/webp/2024/11/Refinements-to-rail-line-width-1.png 320w, /content/images/size/w640/format/webp/2024/11/Refinements-to-rail-line-width-1.png 600w, /content/images/size/w960/format/webp/2024/11/Refinements-to-rail-line-width-1.png 960w" sizes="(max-width: 400px) 300px, 400px" type="image/webp" > <img class="aspect-[16/9] bg-bgr-tone object-cover w-full h-auto rounded-[inherit] will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="/content/images/size/w320/format/webp/2024/11/Refinements-to-rail-line-width-1.png 320w, /content/images/size/w640/format/webp/2024/11/Refinements-to-rail-line-width-1.png 600w, /content/images/size/w960/format/webp/2024/11/Refinements-to-rail-line-width-1.png 960w" sizes="(max-width: 400px) 300px, 400px" src="/content/images/size/w30/2024/11/Refinements-to-rail-line-width-1.png" alt="screenshots of Transitland global transit map before and after changes to rail styling" /> </picture> </figure> </a> <div class="flex h-full flex-col gap-2" data-post-card-content> <div class="flex items-center flex-wrap gap-2 text-sm" data-post-card-info> <a href="/blog/tag/transitland/" class="hover:text-brand">Transitland</a> <span class="">·</span> <time class="" datetime="2024-11-14">Nov 14, 2024</time> <span class="flex-1"></span> </div> <h3 class="text-typ text-lg sm:text-xl font-semibold hover:text-brand " data-post-card-title> <a href="/blog/giving-equal-prominence-to-buses-and-trains-on-the-map/" class="">Giving equal prominence to buses and trains on the map</a> </h3> <p class="font-light" data-post-card-excerpt> We&#39;ve refined Transitland&#39;s global map to emphasize where riders can access the most frequent transit service. Thanks to leaders at San Francisco&#39;s transit agency for informing this improvement. </p> <ul class="flex gap-3 text-sm font-medium mt-2" data-post-card-authors> <li> <a href="/blog/author/interline/" class="flex gap-1.5 items-center hover:text-brand"> <picture > <source srcset="/content/images/size/w30/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 30w, /content/images/size/w100/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 100w" sizes="24px" type="image/webp" > <img class="size-6 object-cover rounded-full will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="/content/images/size/w30/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 30w, /content/images/size/w100/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 100w" sizes="24px" src="/content/images/size/w30/2024/11/Interline-logo---symbol-only---large-padded.png" alt="" /> </picture> <span>Interline Technologies</span> </a> </li> </ul> </div> </article> <article class="post tag-transitland no-image relative text-typ-tone flex flex-col gap-4" data-post-card> <div class="flex h-full flex-col gap-2" data-post-card-content> <div class="flex items-center flex-wrap gap-2 text-sm" data-post-card-info> <a href="/blog/tag/transitland/" class="hover:text-brand">Transitland</a> <span class="">·</span> <time class="" datetime="2023-09-14">Sep 14, 2023</time> <span class="flex-1"></span> </div> <h3 class="text-typ text-lg sm:text-xl font-semibold hover:text-brand " data-post-card-title> <a href="/blog/turning-off-the-transitland-v1-datastore-api/" class="">Turning off the Transitland v1 Datastore API</a> </h3> <p class="font-light" data-post-card-excerpt> We announced the multi-step deprecation of the Transitland v1 API in a blog post in 2019. The time has now come the Interline team to finally turn off the v1 Datastore API. </p> <ul class="flex gap-3 text-sm font-medium mt-2" data-post-card-authors> <li> <a href="/blog/author/interline/" class="flex gap-1.5 items-center hover:text-brand"> <picture > <source srcset="/content/images/size/w30/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 30w, /content/images/size/w100/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 100w" sizes="24px" type="image/webp" > <img class="size-6 object-cover rounded-full will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="/content/images/size/w30/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 30w, /content/images/size/w100/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 100w" sizes="24px" src="/content/images/size/w30/2024/11/Interline-logo---symbol-only---large-padded.png" alt="" /> </picture> <span>Interline Technologies</span> </a> </li> </ul> </div> </article> <article class="post tag-gtfs relative text-typ-tone flex flex-col gap-4" data-post-card> <a href="/blog/us-ntd-reporting-gtfs-adopted/" class="block"> <figure class="rounded-theme-xxs border border-brd overflow-hidden"> <picture > <source srcset="/content/images/size/w320/format/webp/2024/11/bil-geographic-service-coverage-area.png 320w, /content/images/size/w640/format/webp/2024/11/bil-geographic-service-coverage-area.png 600w, /content/images/size/w960/format/webp/2024/11/bil-geographic-service-coverage-area.png 960w" sizes="(max-width: 400px) 300px, 400px" type="image/webp" > <img class="aspect-[16/9] bg-bgr-tone object-cover w-full h-auto rounded-[inherit] will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="/content/images/size/w320/format/webp/2024/11/bil-geographic-service-coverage-area.png 320w, /content/images/size/w640/format/webp/2024/11/bil-geographic-service-coverage-area.png 600w, /content/images/size/w960/format/webp/2024/11/bil-geographic-service-coverage-area.png 960w" sizes="(max-width: 400px) 300px, 400px" src="/content/images/size/w30/2024/11/bil-geographic-service-coverage-area.png" alt="US Federal Transit Administration finalizes plan to collect GTFS URLs in US National Transit Database" /> </picture> </figure> </a> <div class="flex h-full flex-col gap-2" data-post-card-content> <div class="flex items-center flex-wrap gap-2 text-sm" data-post-card-info> <a href="/blog/tag/gtfs/" class="hover:text-brand">GTFS</a> <span class="">·</span> <time class="" datetime="2023-04-28">Apr 28, 2023</time> <span class="flex-1"></span> </div> <h3 class="text-typ text-lg sm:text-xl font-semibold hover:text-brand " data-post-card-title> <a href="/blog/us-ntd-reporting-gtfs-adopted/" class="">US Federal Transit Administration finalizes plan to collect GTFS URLs in US National Transit Database</a> </h3> <p class="font-light" data-post-card-excerpt> To meet meet the Bipartisan Infrastructure Law&#39;s requirement to collect data on American transit agencies&#39; &quot;geographic service area coverage,&quot; the US Federal Transit Administration will begin to require GTFS feeds from fixed-route transit agencies that receive federal funds. </p> <ul class="flex gap-3 text-sm font-medium mt-2" data-post-card-authors> <li> <a href="/blog/author/drew/" class="flex gap-1.5 items-center hover:text-brand"> <picture > <source srcset="https://www.gravatar.com/avatar/4bac2feda69c215e53b72757902c7a5e?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp 30w, https://www.gravatar.com/avatar/4bac2feda69c215e53b72757902c7a5e?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp 100w" sizes="24px" type="image/webp" > <img class="size-6 object-cover rounded-full will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="https://www.gravatar.com/avatar/4bac2feda69c215e53b72757902c7a5e?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp 30w, https://www.gravatar.com/avatar/4bac2feda69c215e53b72757902c7a5e?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp 100w" sizes="24px" src="https://www.gravatar.com/avatar/4bac2feda69c215e53b72757902c7a5e?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp" alt="" /> </picture> <span>Drew Dara-Abrams</span> </a> </li> </ul> </div> </article> <article class="post tag-about-interline relative text-typ-tone flex flex-col gap-4" data-post-card> <a href="/blog/interline-blog-rss-feed/" class="block"> <figure class="rounded-theme-xxs border border-brd overflow-hidden"> <picture > <source srcset="/content/images/size/w320/format/webp/2024/11/social_style_3_rss-512-1.png 320w, /content/images/size/w640/format/webp/2024/11/social_style_3_rss-512-1.png 600w, /content/images/size/w960/format/webp/2024/11/social_style_3_rss-512-1.png 960w" sizes="(max-width: 400px) 300px, 400px" type="image/webp" > <img class="aspect-[16/9] bg-bgr-tone object-cover w-full h-auto rounded-[inherit] will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="/content/images/size/w320/format/webp/2024/11/social_style_3_rss-512-1.png 320w, /content/images/size/w640/format/webp/2024/11/social_style_3_rss-512-1.png 600w, /content/images/size/w960/format/webp/2024/11/social_style_3_rss-512-1.png 960w" sizes="(max-width: 400px) 300px, 400px" src="/content/images/size/w30/2024/11/social_style_3_rss-512-1.png" alt="Follow the Interline blog using RSS" /> </picture> </figure> </a> <div class="flex h-full flex-col gap-2" data-post-card-content> <div class="flex items-center flex-wrap gap-2 text-sm" data-post-card-info> <a href="/blog/tag/about-interline/" class="hover:text-brand">About Interline</a> <span class="">·</span> <time class="" datetime="2022-11-28">Nov 28, 2022</time> <span class="flex-1"></span> </div> <h3 class="text-typ text-lg sm:text-xl font-semibold hover:text-brand " data-post-card-title> <a href="/blog/interline-blog-rss-feed/" class="">Follow the Interline blog using RSS</a> </h3> <p class="font-light" data-post-card-excerpt> For the latest updates from Interline, you can now follow our blog using an RSS feed reader </p> <ul class="flex gap-3 text-sm font-medium mt-2" data-post-card-authors> <li> <a href="/blog/author/interline/" class="flex gap-1.5 items-center hover:text-brand"> <picture > <source srcset="/content/images/size/w30/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 30w, /content/images/size/w100/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 100w" sizes="24px" type="image/webp" > <img class="size-6 object-cover rounded-full will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="/content/images/size/w30/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 30w, /content/images/size/w100/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 100w" sizes="24px" src="/content/images/size/w30/2024/11/Interline-logo---symbol-only---large-padded.png" alt="" /> </picture> <span>Interline Technologies</span> </a> </li> </ul> </div> </article> <article class="post tag-511-sf-bay-regional-feed tag-gtfs relative text-typ-tone flex flex-col gap-4" data-post-card> <a href="/blog/mtc-regional-gtfs-feed-fares-updates/" class="block"> <figure class="rounded-theme-xxs border border-brd overflow-hidden"> <picture > <source srcset="/content/images/size/w320/format/webp/2024/11/ios-directions-with-fares-2.png 320w, /content/images/size/w640/format/webp/2024/11/ios-directions-with-fares-2.png 600w, /content/images/size/w960/format/webp/2024/11/ios-directions-with-fares-2.png 960w" sizes="(max-width: 400px) 300px, 400px" type="image/webp" > <img class="aspect-[16/9] bg-bgr-tone object-cover w-full h-auto rounded-[inherit] will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="/content/images/size/w320/format/webp/2024/11/ios-directions-with-fares-2.png 320w, /content/images/size/w640/format/webp/2024/11/ios-directions-with-fares-2.png 600w, /content/images/size/w960/format/webp/2024/11/ios-directions-with-fares-2.png 960w" sizes="(max-width: 400px) 300px, 400px" src="/content/images/size/w30/2024/11/ios-directions-with-fares-2.png" alt="Updated GTFS-Fares v2 for the SF Bay Area" /> </picture> </figure> </a> <div class="flex h-full flex-col gap-2" data-post-card-content> <div class="flex items-center flex-wrap gap-2 text-sm" data-post-card-info> <a href="/blog/tag/511-sf-bay-regional-feed/" class="hover:text-brand">511.org SF Bay Regional Feed</a> <span class="">·</span> <time class="" datetime="2022-10-04">Oct 4, 2022</time> <span class="flex-1"></span> </div> <h3 class="text-typ text-lg sm:text-xl font-semibold hover:text-brand " data-post-card-title> <a href="/blog/mtc-regional-gtfs-feed-fares-updates/" class="">Updated GTFS-Fares v2 for the SF Bay Area</a> </h3> <p class="font-light" data-post-card-excerpt> MTC and Interline have released updated fares and transfer discounts for over 30 Bay Area transit agencies using the adopted GTFS-Fares v2 &quot;base implementation&quot; and a series of proposed extensions. </p> <ul class="flex gap-3 text-sm font-medium mt-2" data-post-card-authors> <li> <a href="/blog/author/drew/" class="flex gap-1.5 items-center hover:text-brand"> <picture > <source srcset="https://www.gravatar.com/avatar/4bac2feda69c215e53b72757902c7a5e?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp 30w, https://www.gravatar.com/avatar/4bac2feda69c215e53b72757902c7a5e?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp 100w" sizes="24px" type="image/webp" > <img class="size-6 object-cover rounded-full will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="https://www.gravatar.com/avatar/4bac2feda69c215e53b72757902c7a5e?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp 30w, https://www.gravatar.com/avatar/4bac2feda69c215e53b72757902c7a5e?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp 100w" sizes="24px" src="https://www.gravatar.com/avatar/4bac2feda69c215e53b72757902c7a5e?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp" alt="" /> </picture> <span>Drew Dara-Abrams</span> </a> </li> </ul> </div> </article> <article class="post tag-gtfs relative text-typ-tone flex flex-col gap-4" data-post-card> <a href="/blog/us-ntd-reporting-gtfs/" class="block"> <figure class="rounded-theme-xxs border border-brd overflow-hidden"> <picture > <source srcset="/content/images/size/w320/format/webp/2024/11/us-ntd-federal-register.png 320w, /content/images/size/w640/format/webp/2024/11/us-ntd-federal-register.png 600w, /content/images/size/w960/format/webp/2024/11/us-ntd-federal-register.png 960w" sizes="(max-width: 400px) 300px, 400px" type="image/webp" > <img class="aspect-[16/9] bg-bgr-tone object-cover w-full h-auto rounded-[inherit] will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="/content/images/size/w320/format/webp/2024/11/us-ntd-federal-register.png 320w, /content/images/size/w640/format/webp/2024/11/us-ntd-federal-register.png 600w, /content/images/size/w960/format/webp/2024/11/us-ntd-federal-register.png 960w" sizes="(max-width: 400px) 300px, 400px" src="/content/images/size/w30/2024/11/us-ntd-federal-register.png" alt="US National Transit Database to collect GTFS URLs" /> </picture> </figure> </a> <div class="flex h-full flex-col gap-2" data-post-card-content> <div class="flex items-center flex-wrap gap-2 text-sm" data-post-card-info> <a href="/blog/tag/gtfs/" class="hover:text-brand">GTFS</a> <span class="">·</span> <time class="" datetime="2022-09-07">Sep 7, 2022</time> <span class="flex-1"></span> </div> <h3 class="text-typ text-lg sm:text-xl font-semibold hover:text-brand " data-post-card-title> <a href="/blog/us-ntd-reporting-gtfs/" class="">US National Transit Database to collect GTFS URLs</a> </h3> <p class="font-light" data-post-card-excerpt> American public transit agencies that receive federal funds are required to report information for inclusion in the National Transit Database. The Federal Transit Administration is proposing that each agency will also provide a URL for a GTFS feed in their NTD reports. </p> <ul class="flex gap-3 text-sm font-medium mt-2" data-post-card-authors> <li> <a href="/blog/author/drew/" class="flex gap-1.5 items-center hover:text-brand"> <picture > <source srcset="https://www.gravatar.com/avatar/4bac2feda69c215e53b72757902c7a5e?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp 30w, https://www.gravatar.com/avatar/4bac2feda69c215e53b72757902c7a5e?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp 100w" sizes="24px" type="image/webp" > <img class="size-6 object-cover rounded-full will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="https://www.gravatar.com/avatar/4bac2feda69c215e53b72757902c7a5e?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp 30w, https://www.gravatar.com/avatar/4bac2feda69c215e53b72757902c7a5e?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp 100w" sizes="24px" src="https://www.gravatar.com/avatar/4bac2feda69c215e53b72757902c7a5e?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp" alt="" /> </picture> <span>Drew Dara-Abrams</span> </a> </li> </ul> </div> </article> <article class="post tag-gtfs tag-511-sf-bay-regional-feed relative text-typ-tone flex flex-col gap-4" data-post-card> <a href="/blog/mtc-regional-stop-observations/" class="block"> <figure class="rounded-theme-xxs border border-brd overflow-hidden"> <picture > <source srcset="/content/images/size/w320/format/webp/2024/11/trip-update-selection.png 320w, /content/images/size/w640/format/webp/2024/11/trip-update-selection.png 600w, /content/images/size/w960/format/webp/2024/11/trip-update-selection.png 960w" sizes="(max-width: 400px) 300px, 400px" type="image/webp" > <img class="aspect-[16/9] bg-bgr-tone object-cover w-full h-auto rounded-[inherit] will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="/content/images/size/w320/format/webp/2024/11/trip-update-selection.png 320w, /content/images/size/w640/format/webp/2024/11/trip-update-selection.png 600w, /content/images/size/w960/format/webp/2024/11/trip-update-selection.png 960w" sizes="(max-width: 400px) 300px, 400px" src="/content/images/size/w30/2024/11/trip-update-selection.png" alt="Observed stop arrivals and departures through the SF Bay Area" /> </picture> </figure> </a> <div class="flex h-full flex-col gap-2" data-post-card-content> <div class="flex items-center flex-wrap gap-2 text-sm" data-post-card-info> <a href="/blog/tag/gtfs/" class="hover:text-brand">GTFS</a> <span class="">·</span> <time class="" datetime="2022-07-15">Jul 15, 2022</time> <span class="flex-1"></span> </div> <h3 class="text-typ text-lg sm:text-xl font-semibold hover:text-brand " data-post-card-title> <a href="/blog/mtc-regional-stop-observations/" class="">Observed stop arrivals and departures through the SF Bay Area</a> </h3> <p class="font-light" data-post-card-excerpt> Interline and the Metropolitan Transportation Commission are now releasing monthly &quot;stop observation&quot; datasets derived from the Regional GTFS Realtime Feed. </p> <ul class="flex gap-3 text-sm font-medium mt-2" data-post-card-authors> <li> <a href="/blog/author/drew/" class="flex gap-1.5 items-center hover:text-brand"> <picture > <source srcset="https://www.gravatar.com/avatar/4bac2feda69c215e53b72757902c7a5e?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp 30w, https://www.gravatar.com/avatar/4bac2feda69c215e53b72757902c7a5e?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp 100w" sizes="24px" type="image/webp" > <img class="size-6 object-cover rounded-full will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="https://www.gravatar.com/avatar/4bac2feda69c215e53b72757902c7a5e?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp 30w, https://www.gravatar.com/avatar/4bac2feda69c215e53b72757902c7a5e?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp 100w" sizes="24px" src="https://www.gravatar.com/avatar/4bac2feda69c215e53b72757902c7a5e?s&#x3D;250&amp;r&#x3D;x&amp;d&#x3D;mp" alt="" /> </picture> <span>Drew Dara-Abrams</span> </a> </li> </ul> </div> </article> <article class="post tag-transitland no-image relative text-typ-tone flex flex-col gap-4" data-post-card> <div class="flex h-full flex-col gap-2" data-post-card-content> <div class="flex items-center flex-wrap gap-2 text-sm" data-post-card-info> <a href="/blog/tag/transitland/" class="hover:text-brand">Transitland</a> <span class="">·</span> <time class="" datetime="2022-06-16">Jun 16, 2022</time> <span class="flex-1"></span> </div> <h3 class="text-typ text-lg sm:text-xl font-semibold hover:text-brand " data-post-card-title> <a href="/blog/downloading-archived-gtfs-feed-versions-from-transitland/" class="">Downloading archived GTFS feed versions from Transitland</a> </h3> <p class="font-light" data-post-card-excerpt> We are adjusting access to Transitland&#39;s GTFS feed version archive to better balance concerns. </p> <ul class="flex gap-3 text-sm font-medium mt-2" data-post-card-authors> <li> <a href="/blog/author/interline/" class="flex gap-1.5 items-center hover:text-brand"> <picture > <source srcset="/content/images/size/w30/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 30w, /content/images/size/w100/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 100w" sizes="24px" type="image/webp" > <img class="size-6 object-cover rounded-full will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="/content/images/size/w30/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 30w, /content/images/size/w100/format/webp/2024/11/Interline-logo---symbol-only---large-padded.png 100w" sizes="24px" src="/content/images/size/w30/2024/11/Interline-logo---symbol-only---large-padded.png" alt="" /> </picture> <span>Interline Technologies</span> </a> </li> </ul> </div> </article> </div> <nav class="my-12 text-typ flex items-center justify-center gap-4 font-medium sm:font-normal text-sm sm:gap-6 " data-pagination> <a data-prev class="text-sm font-medium flex items-center gap-0.5 border border-brd rounded-theme px-3 py-1 sm:px-4 hover:bg-bgr-tone cursor-not-allowed disabled" href="javascript:"> <i class="icon icon-chevron-left size-4 stroke-[2.5] -ml-1 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-chevron-left" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M15 6l-6 6l6 6" /></svg> </i><span>Prev</span> </a> <span data-page-number class="">Page 1 of 3</span> <a data-next class="text-sm font-medium flex items-center gap-0.5 border border-brd rounded-theme px-3 py-1 sm:px-4 hover:bg-bgr-tone" href="/blog/page/2/"> <span>Next</span><i class="icon icon-chevron-right size-4 stroke-[2.5] -mr-1 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-chevron-right" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M9 6l6 6l-6 6" /></svg> </i> </a> </nav> </div> </section> </main> <footer class="px-4 sm:px-6 bg-bgr mt-16" data-footer> <div class="max-w-container mx-auto relative before:content-[''] before:absolute before:top-0 before:left-0 before:w-full before:h-[1px] before:bg-fading"> <div class="grid grid-cols-2 md:grid-cols-4 lg:grid-cols-6 gap-4 py-8 md:gap-8 md:py-12"> <div class="flex flex-col items-start gap-3 col-span-2 md:col-span-1 lg:col-span-2" data-footer-brand> <a href="https://www.interline.io" data-brand> <picture data-logo='dark'> <source srcset="/content/images/size/w100/format/webp/2024/11/interline-logo-white-on-transparent-2.png 100w, /content/images/size/w320/format/webp/2024/11/interline-logo-white-on-transparent-2.png 320w, /content/images/size/w640/format/webp/2024/11/interline-logo-white-on-transparent-2.png 600w" sizes="(max-width: 800px) 200px, 320px" type="image/webp" > <img class="h-[var(--logo-h-mobile)] w-[var(--logo-w-mobile)] md:h-[var(--logo-h-desktop)] md:w-[var(--logo-w-desktop)] will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="/content/images/size/w100/format/webp/2024/11/interline-logo-white-on-transparent-2.png 100w, /content/images/size/w320/format/webp/2024/11/interline-logo-white-on-transparent-2.png 320w, /content/images/size/w640/format/webp/2024/11/interline-logo-white-on-transparent-2.png 600w" sizes="(max-width: 800px) 200px, 320px" src="/content/images/size/w30/2024/11/interline-logo-white-on-transparent-2.png" alt="Interline Technologies" /> </picture> <picture data-logo='default'> <source srcset="/content/images/size/w100/format/webp/2023/10/Interline-logo-full-1.png 100w, /content/images/size/w320/format/webp/2023/10/Interline-logo-full-1.png 320w, /content/images/size/w640/format/webp/2023/10/Interline-logo-full-1.png 600w" sizes="(max-width: 800px) 200px, 320px" type="image/webp" > <img class="h-[var(--logo-h-mobile)] w-[var(--logo-w-mobile)] md:h-[var(--logo-h-desktop)] md:w-[var(--logo-w-desktop)] will-change-[filter] transition-[filter] blur" onload="this.classList.remove('blur')" loading="lazy" srcset="/content/images/size/w100/format/webp/2023/10/Interline-logo-full-1.png 100w, /content/images/size/w320/format/webp/2023/10/Interline-logo-full-1.png 320w, /content/images/size/w640/format/webp/2023/10/Interline-logo-full-1.png 600w" sizes="(max-width: 800px) 200px, 320px" src="/content/images/size/w30/2023/10/Interline-logo-full-1.png" alt="Interline Technologies" /> </picture> </a> <p class="text-typ-tone">We&#x27;re a product and consulting business that helps organizations understand and improve transportation networks, digitally.</p> <nav class="flex items-center gap-2 text-typ-tone text-base" data-socials="footer" x-data="socials"> <a :href="rss" :class="rss && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="RSS"><i class="icon icon-rss w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-rss" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <circle cx="5" cy="19" r="1" /> <path d="M4 4a16 16 0 0 1 16 16" /> <path d="M4 11a9 9 0 0 1 9 9" /> </svg> </i><span class="sr-only">RSS</span></a> <a :href="threads" :class="threads && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Threads"><i class="icon icon-threads w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-brand-threads"> <path stroke="none" d="M0 0h24v24H0z" fill="none" /> <path d="M19 7.5c-1.333 -3 -3.667 -4.5 -7 -4.5c-5 0 -8 2.5 -8 9s3.5 9 8 9s7 -3 7 -5s-1 -5 -7 -5c-2.5 0 -3 1.25 -3 2.5c0 1.5 1 2.5 2.5 2.5c2.5 0 3.5 -1.5 3.5 -5s-2 -4 -3 -4s-1.833 .333 -2.5 1" /> </svg> </i><span class="sr-only">Threads</span></a> <a :href="linkedin" :class="linkedin && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Linkedin"><i class="icon icon-linkedin w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-linkedin" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z"></path> <rect x="2" y="9" width="4" height="12"></rect> <circle cx="4" cy="4" r="2"></circle> </svg> </i><span class="sr-only">Linkedin</span></a> <a :href="discord" :class="discord && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Discord"><i class="icon icon-discord w-4 h-4 stroke-2 stroke-2"> </i><span class="sr-only">Discord</span></a> <a :href="github" :class="github && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Github"><i class="icon icon-github w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-github" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <desc>Download more icon variants from https://tabler-icons.io/i/brand-github</desc> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <path d="M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5" /> </svg> </i><span class="sr-only">Github</span></a> <a :href="instagram" :class="instagram && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Instagram"><i class="icon icon-instagram w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-instagram" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <desc>Download more icon variants from https://tabler-icons.io/i/brand-instagram</desc> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <rect x="4" y="4" width="16" height="16" rx="4" /> <circle cx="12" cy="12" r="3" /> <line x1="16.5" y1="7.5" x2="16.5" y2="7.501" /> </svg> </i><span class="sr-only">Instagram</span></a> <a :href="pinterest" :class="pinterest && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Pinterest"><i class="icon icon-pinterest w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-pinterest" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <line x1="8" y1="20" x2="12" y2="11" /> <path d="M10.7 14c.437 1.263 1.43 2 2.55 2c2.071 0 3.75 -1.554 3.75 -4a5 5 0 1 0 -9.7 1.7" /> <circle cx="12" cy="12" r="9" /> </svg> </i><span class="sr-only">Pinterest</span></a> <a :href="reddit" :class="reddit && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Reddit"><i class="icon icon-reddit w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-reddit" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <path d="M12 8c2.648 0 5.028 .826 6.675 2.14a2.5 2.5 0 0 1 2.326 4.36c0 3.59 -4.03 6.5 -9 6.5c-4.875 0 -8.845 -2.8 -9 -6.294l-1 -.206a2.5 2.5 0 0 1 2.326 -4.36c1.646 -1.313 4.026 -2.14 6.674 -2.14z" /> <path d="M12 8l1 -5l6 1" /> <circle cx="19" cy="4" r="1" /> <circle cx="9" cy="13" r=".5" fill="currentColor" /> <circle cx="15" cy="13" r=".5" fill="currentColor" /> <path d="M10 17c.667 .333 1.333 .5 2 .5s1.333 -.167 2 -.5" /> </svg> </i><span class="sr-only">Reddit</span></a> <a :href="telegram" :class="telegram && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Telegram"><i class="icon icon-telegram w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-telegram" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <desc>Download more icon variants from https://tabler-icons.io/i/brand-telegram</desc> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <path d="M15 10l-4 4l6 6l4 -16l-18 7l4 2l2 6l3 -4" /> </svg> </i><span class="sr-only">Telegram</span></a> <a :href="tiktok" :class="tiktok && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Tiktok"><i class="icon icon-tiktok w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-tiktok" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <desc>Download more icon variants from https://tabler-icons.io/i/brand-tiktok</desc> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <path d="M9 12a4 4 0 1 0 4 4v-12a5 5 0 0 0 5 5" /> </svg> </i><span class="sr-only">Tiktok</span></a> <a :href="whatsapp" :class="whatsapp && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Whatsapp"><i class="icon icon-whatsapp w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-whatsapp" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <desc>Download more icon variants from https://tabler-icons.io/i/brand-whatsapp</desc> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <path d="M3 21l1.65 -3.8a9 9 0 1 1 3.4 2.9l-5.05 .9" /> <path d="M9 10a0.5 .5 0 0 0 1 0v-1a0.5 .5 0 0 0 -1 0v1a5 5 0 0 0 5 5h1a0.5 .5 0 0 0 0 -1h-1a0.5 .5 0 0 0 0 1" /> </svg> </i><span class="sr-only">Whatsapp</span></a> <a :href="youtube" :class="youtube && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Youtube"><i class="icon icon-youtube w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-youtube" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <desc>Download more icon variants from https://tabler-icons.io/i/brand-youtube</desc> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <rect x="3" y="5" width="18" height="14" rx="4" /> <path d="M10 9l5 3l-5 3z" /> </svg> </i><span class="sr-only">Youtube</span></a> <a rel="me" :href="mastodon" :class="mastodon && '!block'" class="hidden p-2 border border-brd bg-bgr rounded-theme hover:bg-bgr-tone hover:text-brand hover:border-brand" aria-label="Mastodon"><i class="icon icon-mastodon w-4 h-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-brand-mastodon" ><path stroke="none" d="M0 0h24v24H0z" fill="none" /><path d="M18.648 15.254c-1.816 1.763 -6.648 1.626 -6.648 1.626a18.262 18.262 0 0 1 -3.288 -.256c1.127 1.985 4.12 2.81 8.982 2.475c-1.945 2.013 -13.598 5.257 -13.668 -7.636l-.026 -1.154c0 -3.036 .023 -4.115 1.352 -5.633c1.671 -1.91 6.648 -1.666 6.648 -1.666s4.977 -.243 6.648 1.667c1.329 1.518 1.352 2.597 1.352 5.633s-.456 4.074 -1.352 4.944z" /><path d="M12 11.204v-2.926c0 -1.258 -.895 -2.278 -2 -2.278s-2 1.02 -2 2.278v4.722m4 -4.722c0 -1.258 .895 -2.278 2 -2.278s2 1.02 2 2.278v4.722" /></svg> </i><span class="sr-only">Mastodon</span></a> </nav> </div> <span class="hidden lg:block"></span> <div class="flex flex-col gap-2 mt-2" data-footer-nav="primary"> <span class="font-semibold">Navigate to</span> <nav class=""> <ul class="flex flex-col items-start gap-2 text-typ-tone text-sm"> <li class="nav-transitland-platform flex flex-col relative" data-label="Transitland Platform" data-slug="transitland-platform" data-length="20"> <a class="flex hover:text-brand" href="https://www.interline.io/transitland/" > <span>Transitland Platform</span> </a> </li> <li class="nav-intro-to-transitland flex flex-col relative is-subitem" data-label="- Intro to Transitland" data-slug="intro-to-transitland" data-length="22"> <a class="flex hover:text-brand" href="https://www.interline.io/transitland/" > <span>- Intro to Transitland</span> </a> </li> <li class="nav-transitland-apis-for-developers flex flex-col relative is-subitem" data-label="- Transitland APIs for Developers" data-slug="transitland-apis-for-developers" data-length="33"> <a class="flex hover:text-brand" href="https://www.interline.io/transitland/apis-for-developers/" > <span>- Transitland APIs for Developers</span> </a> </li> <li class="nav-custom-bulk-transit-data-exports flex flex-col relative is-subitem" data-label="- Custom Bulk Transit Data Exports" data-slug="custom-bulk-transit-data-exports" data-length="34"> <a class="flex hover:text-brand" href="https://www.interline.io/transitland/custom-bulk-transit-data/" > <span>- Custom Bulk Transit Data Exports</span> </a> </li> <li class="nav-all-stops-in-the-united-states flex flex-col relative is-subitem" data-label="- All Stops in the United States" data-slug="all-stops-in-the-united-states" data-length="32"> <a class="flex hover:text-brand" href="https://www.interline.io/transitland/all-us-stops-bulk-data/" > <span>- All Stops in the United States</span> </a> </li> <li class="nav-compare-transitland flex flex-col relative is-subitem" data-label="- Compare Transitland" data-slug="compare-transitland" data-length="21"> <a class="flex hover:text-brand" href="https://www.interline.io/transitland/compare/" > <span>- Compare Transitland</span> </a> </li> <li class="nav-transitland-plans-pricing flex flex-col relative is-subitem" data-label="- Transitland Plans &amp; Pricing" data-slug="transitland-plans-pricing" data-length="30"> <a class="flex hover:text-brand" href="https://www.transit.land/plans-pricing/" > <span>- Transitland Plans &amp; Pricing</span> </a> </li> <li class="nav-interline-routing-platform flex flex-col relative" data-label="Interline Routing Platform" data-slug="interline-routing-platform" data-length="26"> <a class="flex hover:text-brand" href="https://www.interline.io/routing-platform/" > <span>Interline Routing Platform</span> </a> </li> <li class="nav-intro-to-valhalla flex flex-col relative is-subitem" data-label="- Intro to Valhalla" data-slug="intro-to-valhalla" data-length="19"> <a class="flex hover:text-brand" href="https://www.interline.io/valhalla/" > <span>- Intro to Valhalla</span> </a> </li> <li class="nav-valhalla-tilepacks flex flex-col relative is-subitem" data-label="- Valhalla Tilepacks" data-slug="valhalla-tilepacks" data-length="20"> <a class="flex hover:text-brand" href="https://www.interline.io/valhalla/tilepacks/" > <span>- Valhalla Tilepacks</span> </a> </li> <li class="nav-global-hosted-valhalla-apis flex flex-col relative is-subitem" data-label="- Global Hosted Valhalla APIs" data-slug="global-hosted-valhalla-apis" data-length="29"> <a class="flex hover:text-brand" href="https://rapidapi.com/interline-technologies-interline-technologies-default/api/interline-global-valhalla-navigation-and-routing-engine/" > <span>- Global Hosted Valhalla APIs</span> </a> </li> <li class="nav-transitland-routing-api flex flex-col relative is-subitem" data-label="- Transitland Routing API" data-slug="transitland-routing-api" data-length="25"> <a class="flex hover:text-brand" href="https://www.transit.land/documentation/routing-api/" > <span>- Transitland Routing API</span> </a> </li> <li class="nav-resources flex flex-col relative" data-label="Resources" data-slug="resources" data-length="9"> <a class="flex hover:text-brand" href="https://www.interline.io/resources/" > <span>Resources</span> </a> </li> <li class="nav-blog nav-current flex flex-col relative is-subitem" data-label="- Blog" data-slug="blog" data-length="6"> <a class="flex hover:text-brand" href="https://www.interline.io/blog/" > <span>- Blog</span> </a> </li> <li class="nav-consulting flex flex-col relative is-subitem" data-label="- Consulting" data-slug="consulting" data-length="12"> <a class="flex hover:text-brand" href="https://www.interline.io/consulting/" > <span>- Consulting</span> </a> </li> <li class="nav-applied-research flex flex-col relative is-subitem" data-label="- Applied Research" data-slug="applied-research" data-length="18"> <a class="flex hover:text-brand" href="https://www.interline.io/resources/applied-research/" > <span>- Applied Research</span> </a> </li> <li class="nav-osm-extracts flex flex-col relative is-subitem" data-label="- OSM Extracts" data-slug="osm-extracts" data-length="14"> <a class="flex hover:text-brand" href="https://app.interline.io/osm_extracts/interactive_view" > <span>- OSM Extracts</span> </a> </li> <li class="nav-about-interline flex flex-col relative" data-label="About Interline" data-slug="about-interline" data-length="15"> <a class="flex hover:text-brand" href="https://www.interline.io/about/" > <span>About Interline</span> </a> </li> </ul> </nav> </div> <div class="flex flex-col gap-2 mt-2" data-footer-nav="secondary"> <span class="font-semibold">For more info</span> <nav class=""> <ul class="flex flex-col items-start gap-2 text-typ-tone text-sm"> <li class="nav-terms flex flex-col relative" data-label="Terms" data-slug="terms" data-length="5"> <a class="flex hover:text-brand" href="https://www.interline.io/legal/terms/" > <span>Terms</span> </a> </li> <li class="nav-privacy flex flex-col relative" data-label="Privacy" data-slug="privacy" data-length="7"> <a class="flex hover:text-brand" href="https://www.interline.io/legal/privacy/" > <span>Privacy</span> </a> </li> <li class="nav-support flex flex-col relative" data-label="Support" data-slug="support" data-length="7"> <a class="flex hover:text-brand" href="https://www.interline.io/support/" > <span>Support</span> </a> </li> <li class="nav-docs flex flex-col relative" data-label="Docs" data-slug="docs" data-length="4"> <a class="flex hover:text-brand" href="https://www.interline.io/docs/" > <span>Docs</span> </a> </li> </ul> </nav> </div> <div class="flex flex-col gap-2 mt-2" data-footer-nav="categories"> <span class="font-semibold">Read on our blog</span> <nav class=""> <ul class="flex flex-col items-start gap-2 text-typ-tone text-sm"> <li class="flex flex-col relative"> <a href="/blog/tag/about-interline/" class="flex hover:text-brand">About Interline</a> </li> <li class="flex flex-col relative"> <a href="/blog/tag/transitland/" class="flex hover:text-brand">Transitland</a> </li> <li class="flex flex-col relative"> <a href="/blog/tag/gtfs/" class="flex hover:text-brand">GTFS</a> </li> <li class="flex flex-col relative"> <a href="/blog/tag/511-sf-bay-regional-feed/" class="flex hover:text-brand">511.org SF Bay Regional Feed</a> </li> <li class="flex flex-col relative"> <a href="/blog/tag/openstreetmap/" class="flex hover:text-brand">OpenStreetMap</a> </li> <li class="flex flex-col relative"> <a href="/blog/tag/geojsonl/" class="flex hover:text-brand">GeoJSONL</a> </li> </ul> </nav> </div> </div> <div class="py-4 md:py-6 flex flex-wrap items-center gap-2 relative before:content-[''] before:absolute before:top-0 before:left-0 before:w-full before:h-[1px] before:bg-fading"> <div class="text-sm text-typ-tone"> <span data-footer-date>&copy; 2018 - 2025&nbsp;<a class="hover:underline" href="https://www.interline.io">Interline Technologies LLC</a>.</span> </div> <button class="flex gap-0.5 p-[3px] border border-brd text-typ-tone rounded-theme hover:bg-bgr-tone" aria-label="Toggle color scheme" data-color-scheme-toggle @click="toggleColorScheme(event)"> <span data-theme="light" class="px-[5px] py-0.5 border border-transparent opacity-50 rounded-theme"> <i class="icon icon-sun size-4 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-sun-filled" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <path d="M12 19a1 1 0 0 1 .993 .883l.007 .117v1a1 1 0 0 1 -1.993 .117l-.007 -.117v-1a1 1 0 0 1 1 -1z" stroke-width="0" fill="currentColor" /> <path d="M18.313 16.91l.094 .083l.7 .7a1 1 0 0 1 -1.32 1.497l-.094 -.083l-.7 -.7a1 1 0 0 1 1.218 -1.567l.102 .07z" stroke-width="0" fill="currentColor" /> <path d="M7.007 16.993a1 1 0 0 1 .083 1.32l-.083 .094l-.7 .7a1 1 0 0 1 -1.497 -1.32l.083 -.094l.7 -.7a1 1 0 0 1 1.414 0z" stroke-width="0" fill="currentColor" /> <path d="M4 11a1 1 0 0 1 .117 1.993l-.117 .007h-1a1 1 0 0 1 -.117 -1.993l.117 -.007h1z" stroke-width="0" fill="currentColor" /> <path d="M21 11a1 1 0 0 1 .117 1.993l-.117 .007h-1a1 1 0 0 1 -.117 -1.993l.117 -.007h1z" stroke-width="0" fill="currentColor" /> <path d="M6.213 4.81l.094 .083l.7 .7a1 1 0 0 1 -1.32 1.497l-.094 -.083l-.7 -.7a1 1 0 0 1 1.217 -1.567l.102 .07z" stroke-width="0" fill="currentColor" /> <path d="M19.107 4.893a1 1 0 0 1 .083 1.32l-.083 .094l-.7 .7a1 1 0 0 1 -1.497 -1.32l.083 -.094l.7 -.7a1 1 0 0 1 1.414 0z" stroke-width="0" fill="currentColor" /> <path d="M12 2a1 1 0 0 1 .993 .883l.007 .117v1a1 1 0 0 1 -1.993 .117l-.007 -.117v-1a1 1 0 0 1 1 -1z" stroke-width="0" fill="currentColor" /> <path d="M12 7a5 5 0 1 1 -4.995 5.217l-.005 -.217l.005 -.217a5 5 0 0 1 4.995 -4.783z" stroke-width="0" fill="currentColor" /> </svg> </i> </span> <span data-theme="dark" class="px-[5px] py-0.5 border border-transparent opacity-50 rounded-theme"> <i class="icon icon-moon size-4 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-moon-filled" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"/> <path d="M12 1.992a10 10 0 1 0 9.236 13.838c.341 -.82 -.476 -1.644 -1.298 -1.31a6.5 6.5 0 0 1 -6.864 -10.787l.077 -.08c.551 -.63 .113 -1.653 -.758 -1.653h-.266l-.068 -.006l-.06 -.002z" stroke-width="0" fill="currentColor" /> </svg> </i> </span> </button> </div> </div> </footer> <template data-toggle-template> <button class="ml-0.5" data-class="rotate-180" title="Menu toggle" aria-label="Menu toggle" aria-controls="" aria-expanded="false" @click="toggleSubmenu(event)" > <i class="icon icon-chevron-down size-4 stroke-2 stroke-2"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-chevron-down" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> <polyline points="6 9 12 15 18 9"></polyline> </svg> </i> </button> </template> <script> function renderSubmenus() { const navItems = document.querySelectorAll('[data-nav] li') const subItems = document.querySelectorAll('.is-subitem') const mobileClass = "hidden pl-4 flex flex-col gap-0.5 py-1 px-1.5 basis-full" const desktopClass = "z-[50] min-w-[calc(100%_+_24px)] absolute flex flex-col gap-1 shadow-2xl border border-brd rounded-theme-xxs bg-bgr py-2 px-1.5 -ml-2 mt-11 opacity-0 invisible translate-y-1 transition-all" // Remove '-' signs subItems.forEach(item => { const itemName = item.querySelector('a span') itemName.innerText = itemName.innerText.slice(1) }); // Add subitems in place let subMenu, hasItems navItems.forEach((item, index) => { if (item.classList.contains('is-subitem') && !navItems[index - 1].classList.contains('is-subitem')) { navItems[index - 1].classList.add('is-mainitem'); navItems[index - 1].setAttribute('x-on:click.outside', 'closeSubmenus(event)') } subMenu = item.classList.contains('is-subitem') ? subMenu : document.createElement('ul'); if (item.classList.contains('is-subitem')) { subMenu.appendChild(item) subMenu.setAttribute('data-submenu', '') subMenu.getAttribute('id') === null ? subMenu.setAttribute('id', navItems[index - 1].getAttribute('data-slug')) : '' const menuType = subMenu.closest('nav').getAttribute('data-nav') subMenu.classList = menuType === 'desktop' ? desktopClass : mobileClass } else { item.appendChild(subMenu) } }); const dropdownMenus = document.querySelectorAll('[data-nav] .is-mainitem') const toggle = document.querySelector('[data-toggle-template]'); dropdownMenus.forEach(menu => { const toggleBtn = toggle.content.firstElementChild.cloneNode(true); toggleBtn.setAttribute('aria-controls', menu.getAttribute('data-slug')) menu.insertBefore(toggleBtn, menu.children[1]); }); } </script> <script> window.socials = { rss: '/blog/rss/', threads: '', linkedin: 'https://www.linkedin.com/company/interline-io/', discord: '', github: 'https://github.com/interline-io', instagram: '', pinterest: '', reddit: '', telegram: '', tiktok: '', whatsapp: '', youtube: '', mastodon: 'https://mastodon.social/@interline' } document.addEventListener('alpine:init', () => { Alpine.data('socials', () => (window.socials)) }) </script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10