Spaces:
Running on CPU Upgrade
Running on CPU Upgrade
File size: 70,368 Bytes
3d16fe6 896453f 1f7780e 896453f fcf298e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 | <!doctype html><html lang=en dir=ltr class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-development/openstates-integration" data-has-hydrated=false><head><meta charset=UTF-8><meta name=generator content="Docusaurus v3.10.0"><title data-rh=true>OpenStates Integration & Contribution Opportunities | Open Navigator</title><meta data-rh=true name=viewport content="width=device-width, initial-scale=1.0"/><meta data-rh=true property=og:image content=https://www.communityone.com/img/docusaurus-social-card.jpg /><meta data-rh=true name=twitter:image content=https://www.communityone.com/img/docusaurus-social-card.jpg /><meta data-rh=true property=og:url content=https://www.communityone.com/docs/development/openstates-integration /><meta data-rh=true property=og:locale content=en /><meta data-rh=true name=docusaurus_locale content=en /><meta data-rh=true name=docsearch:language content=en /><meta data-rh=true name=keywords content="civic engagement, policy tracking, meeting minutes, nonprofit tracking, municipal government, advocacy, open data, local government"/><meta data-rh=true property=og:type content=website /><meta data-rh=true property=og:site_name content="Open Navigator"/><meta data-rh=true name=twitter:card content=summary_large_image /><meta data-rh=true name=docusaurus_version content=current /><meta data-rh=true name=docusaurus_tag content=docs-default-current /><meta data-rh=true name=docsearch:version content=current /><meta data-rh=true name=docsearch:docusaurus_tag content=docs-default-current /><meta data-rh=true property=og:title content="OpenStates Integration & Contribution Opportunities | Open Navigator"/><meta data-rh=true name=description content="This document outlines our integration with OpenStates/Plural Policy and potential opportunities to contribute code back to the open-source community."/><meta data-rh=true property=og:description content="This document outlines our integration with OpenStates/Plural Policy and potential opportunities to contribute code back to the open-source community."/><link data-rh=true rel=icon href=/img/favicon.ico /><link data-rh=true rel=canonical href=https://www.communityone.com/docs/development/openstates-integration /><link data-rh=true rel=alternate href=https://www.communityone.com/docs/development/openstates-integration hreflang=en /><link data-rh=true rel=alternate href=https://www.communityone.com/docs/development/openstates-integration hreflang=x-default /><script data-rh=true type=application/ld+json>{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","item":"https://www.communityone.com/docs/for-developers","name":"Developers & Technical Users","position":1},{"@type":"ListItem","item":"https://www.communityone.com/docs/development/openstates-integration","name":"OpenStates Integration & Contribution Opportunities","position":2}]}</script><link rel=alternate type=application/rss+xml href=/blog/rss.xml title="Open Navigator RSS Feed"><link rel=alternate type=application/atom+xml href=/blog/atom.xml title="Open Navigator Atom Feed"><link rel=preconnect href=https://www.google-analytics.com><link rel=preconnect href=https://www.googletagmanager.com><script async src="https://www.googletagmanager.com/gtag/js?id=G-5EQV815915"></script><script>function gtag(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],gtag("js",new Date),gtag("config","G-5EQV815915",{anonymize_ip:!0})</script><link rel=stylesheet href=/assets/css/styles.c89d6b2d.css /><script src=/assets/js/runtime~main.c8fa085e.js defer></script><script src=/assets/js/main.6e24e536.js defer></script></head><body><svg style="display: none;"><defs>
<symbol id=theme-svg-external-link viewBox="0 0 24 24"><path fill=currentColor d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
</defs></svg>
<script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme-7e9")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||(window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light")),document.documentElement.setAttribute("data-theme-choice",t||"system")}(),function(){try{for(var[t,e]of new URLSearchParams(window.location.search).entries())if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id=__docusaurus><link rel=preload as=image href=/img/communityone_logo.svg /><script type=application/ld+json>{"@context":"https://schema.org","@type":"Organization","address":{"@type":"PostalAddress","addressCountry":"US","addressLocality":"Tuscaloosa","addressRegion":"AL","postalCode":"35406","streetAddress":"5617 Lakeridge Court"},"contactPoint":{"@type":"ContactPoint","availableLanguage":["English"],"contactType":"Customer Service","email":"johnbowyer@communityone.com"},"description":"Track 90,000+ jurisdictions, 1.8M nonprofits, and analyze meeting minutes with AI. The open path to everything local.","email":"johnbowyer@communityone.com","legalName":"CommunityOne","logo":"https://www.communityone.com/img/communityone_logo.svg","name":"CommunityOne","sameAs":["https://www.facebook.com/communityone","https://www.instagram.com/communityone","https://twitter.com/communityone","https://www.linkedin.com/company/communityone","https://www.youtube.com/@communityone","https://discord.gg/communityone","https://github.com/getcommunityone/open-navigator"],"url":"https://www.communityone.com"}</script><script type=application/ld+json>{"@context":"https://schema.org","@type":"WebSite","alternateName":"CommunityOne Open Navigator","description":"AI-powered civic engagement platform tracking jurisdictions, nonprofits, and government meetings","name":"Open Navigator","potentialAction":{"@type":"SearchAction","query-input":"required name=search_term_string","target":{"@type":"EntryPoint","urlTemplate":"https://www.communityone.com/search?q={search_term_string}"}},"url":"https://www.communityone.com"}</script><script type=application/ld+json>{"@context":"https://schema.org","@type":"SoftwareApplication","aggregateRating":{"@type":"AggregateRating","ratingCount":"1","ratingValue":"5"},"applicationCategory":"BusinessApplication","description":"Track 90,000+ jurisdictions, 1.8M nonprofits, and analyze meeting minutes with AI","featureList":["Track 90,000+ jurisdictions","Monitor 1.8M nonprofits","Analyze meeting minutes","Legislative bill tracking","Campaign finance data"],"name":"Open Navigator","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"operatingSystem":"Web","screenshot":"https://www.communityone.com/img/docusaurus-social-card.jpg","softwareVersion":"1.0.0"}</script><div role=region aria-label="Skip to main content"><a class=skipToContent_fXgn href=#__docusaurus_skipToContent_fallback>Skip to main content</a></div><nav aria-label=Main class="theme-layout-navbar navbar navbar--fixed-top"><div class=navbar__inner><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded=false class="navbar__toggle clean-btn" type=button><svg width=30 height=30 viewBox="0 0 30 30" aria-hidden=true><path stroke=currentColor stroke-linecap=round stroke-miterlimit=10 stroke-width=2 d="M4 7h22M4 15h22M4 23h22"/></svg></button><a href=https://www.communityone.com target=_self rel="noopener noreferrer" class=navbar__brand><div class=navbar__logo><img src=/img/communityone_logo.svg alt="CommunityOne Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"/><img src=/img/communityone_logo.svg alt="CommunityOne Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"/></div><b class="navbar__title text--truncate">Open Navigator Home</b></a><a class="navbar__item navbar__link" href=/docs/intro>Getting Started</a><a class="navbar__item navbar__link" href=/docs/for-families>Families & Individuals</a><a class="navbar__item navbar__link" href=/docs/for-advocates>Policy Makers</a><a class="navbar__item navbar__link" href=/docs/for-developers>Developers</a><a class="navbar__item navbar__link" href=/docs/data-sources/citations>Data and Terms</a><a class="navbar__item navbar__link" href=/blog>Blog</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href=https://github.com/getcommunityone/open-navigator-for-engagement target=_blank rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type=button disabled title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width=24 height=24 aria-hidden=true class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill=currentColor d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"/></svg><svg viewBox="0 0 24 24" width=24 height=24 aria-hidden=true class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill=currentColor d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"/></svg><svg viewBox="0 0 24 24" width=24 height=24 aria-hidden=true class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill=currentColor d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"/></svg></button></div><div class=navbarSearchContainer_Bca1></div></div></div><div role=presentation class=navbar-sidebar__backdrop></div></nav><div id=__docusaurus_skipToContent_fallback class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class=docsWrapper_hBAB><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type=button></button><div class=docRoot_UBD9><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class=sidebarViewport_aRkj><div class=sidebar_njMd><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=true href=/docs/intro><span title="Getting Started" class=categoryLinkLabel_W154>Getting Started</span></a></div><ul class=menu__list><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/intro><span title=Introduction class=linkLabel_WmDU>Introduction</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/open-navigator><span title="Open Navigator" class=linkLabel_WmDU>Open Navigator</span></a></ul><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" href=/docs/for-families><span title="Families & Individuals" class=categoryLinkLabel_W154>Families & Individuals</span></a><button aria-label="Collapse sidebar category 'Families & Individuals'" aria-expanded=true type=button class="clean-btn menu__caret"></button></div><ul class=menu__list><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/docs/families/community-events><span title="Resources for Families" class=categoryLinkLabel_W154>Resources for Families</span></a></div><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/open-navigator><span title="Getting Started with Open Navigator" class=linkLabel_WmDU>Getting Started with Open Navigator</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/data-sources/citations><span title="Data and Citations" class=linkLabel_WmDU>Data and Citations</span></a></ul><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" href=/docs/for-advocates><span title="Policy Makers & Advocates" class=categoryLinkLabel_W154>Policy Makers & Advocates</span></a><button aria-label="Collapse sidebar category 'Policy Makers & Advocates'" aria-expanded=true type=button class="clean-btn menu__caret"></button></div><ul class=menu__list><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/docs/data-sources/overview><span title="Understanding the Data" class=categoryLinkLabel_W154>Understanding the Data</span></a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/docs/guides/political-economy><span title="Analysis & Strategy" class=categoryLinkLabel_W154>Analysis & Strategy</span></a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/docs/case-studies/tuscaloosa-complete><span title="Real-World Examples" class=categoryLinkLabel_W154>Real-World Examples</span></a></div></ul><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--active" href=/docs/for-developers><span title="Developers & Technical Users" class=categoryLinkLabel_W154>Developers & Technical Users</span></a><button aria-label="Collapse sidebar category 'Developers & Technical Users'" aria-expanded=true type=button class="clean-btn menu__caret"></button></div><ul class=menu__list><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/docs/quickstart><span title="Setup & Installation" class=categoryLinkLabel_W154>Setup & Installation</span></a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/docs/data-sources/citations><span title="Data Sources (Technical)" class=categoryLinkLabel_W154>Data Sources (Technical)</span></a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/docs/guides/jurisdiction-setup><span title="How-To Guides" class=categoryLinkLabel_W154>How-To Guides</span></a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/docs/integrations/mcp-server><span title=Integrations class=categoryLinkLabel_W154>Integrations</span></a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/docs/deployment/databricks-apps><span title=Deployment class=categoryLinkLabel_W154>Deployment</span></a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" role=button aria-expanded=true tabindex=0 href=/docs/development/database-setup><span title=Development class=categoryLinkLabel_W154>Development</span></a></div><ul class=menu__list><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/database-setup><span title="Database Setup & Stats Verification" class=linkLabel_WmDU>Database Setup & Stats Verification</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/events-naming-migration><span title="File Migration to Events Naming Convention" class=linkLabel_WmDU>File Migration to Events Naming Convention</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/adding-data-sources><span title="Adding New Data Sources" class=linkLabel_WmDU>Adding New Data Sources</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/api-logging-errors><span title="API Logging & Error Handling Implementation" class=linkLabel_WmDU>API Logging & Error Handling Implementation</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current=page tabindex=0 href=/docs/development/openstates-integration><span title="OpenStates Integration & Contribution Opportunities" class=linkLabel_WmDU>OpenStates Integration & Contribution Opportunities</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/real-time-statistics><span title="Real-Time Statistics with Geographic Filtering" class=linkLabel_WmDU>Real-Time Statistics with Geographic Filtering</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/schema-migration-summary><span title="Schema Migration Summary" class=linkLabel_WmDU>Schema Migration Summary</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/terminal-corruption-prevention><span title="Terminal Corruption Prevention" class=linkLabel_WmDU>Terminal Corruption Prevention</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/county-data-status><span title="County Search and Aggregation - Status Summary" class=linkLabel_WmDU>County Search and Aggregation - Status Summary</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/intel-optimization><span title="DuckDB + Intel Arc Optimization" class=linkLabel_WmDU>DuckDB + Intel Arc Optimization</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/dashboard-redesign><span title="React Dashboard Redesign Summary" class=linkLabel_WmDU>React Dashboard Redesign Summary</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/docs-migration><span title="Documentation Migration Summary" class=linkLabel_WmDU>Documentation Migration Summary</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/port-guide><span title="π¨ CRITICAL: Which Port to Use?" class=linkLabel_WmDU>π¨ CRITICAL: Which Port to Use?</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/react-refactoring><span title="React + FastAPI Databricks App Refactoring" class=linkLabel_WmDU>React + FastAPI Databricks App Refactoring</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/readme-migration><span title="README Migration Summary" class=linkLabel_WmDU>README Migration Summary</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/refactoring-summary><span title="β¨ React + FastAPI Databricks App - Complete Refactoring Summary" class=linkLabel_WmDU>β¨ React + FastAPI Databricks App - Complete Refactoring Summary</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/changelog><span title="Changelog - Jurisdiction Discovery System" class=linkLabel_WmDU>Changelog - Jurisdiction Discovery System</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/enhancements><span title="β
Enhancement Complete: Official Data Sources Integration" class=linkLabel_WmDU>β
Enhancement Complete: Official Data Sources Integration</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/integration-status><span title="β
Integration Status Summary" class=linkLabel_WmDU>β
Integration Status Summary</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/migration-v2><span title="β
Migration Complete: Pattern-Based Discovery v2.0" class=linkLabel_WmDU>β
Migration Complete: Pattern-Based Discovery v2.0</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/development/new-capabilities><span title="π NEW CAPABILITIES SUMMARY" class=linkLabel_WmDU>π NEW CAPABILITIES SUMMARY</span></a></ul></ul></ul></nav></div></div></aside><main class=docMainContainer_TBSr><div class="container padding-top--md padding-bottom--lg"><div class=row><div class="col docItemCol_VOVn"><div class=docItemContainer_Djhp><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label=Breadcrumbs><ul class=breadcrumbs><li class=breadcrumbs__item><a aria-label="Home page" class=breadcrumbs__link href=/><svg viewBox="0 0 24 24" class=breadcrumbHomeIcon_YNFT><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill=currentColor /></svg></a><li class=breadcrumbs__item><a class=breadcrumbs__link href=/docs/for-developers><span>Developers & Technical Users</span></a><li class=breadcrumbs__item><span class=breadcrumbs__link>Development</span><li class="breadcrumbs__item breadcrumbs__item--active"><span class=breadcrumbs__link>OpenStates Integration & Contribution Opportunities</span></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type=button class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>OpenStates Integration & Contribution Opportunities</h1></header>
<p>This document outlines our integration with OpenStates/Plural Policy and potential opportunities to contribute code back to the open-source community.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-references-added-to-citations>π References Added to Citations<a href=#-references-added-to-citations class=hash-link aria-label="Direct link to π References Added to Citations" title="Direct link to π References Added to Citations" translate=no>β</a></h2>
<p>We have properly cited and referenced the following OpenStates resources:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=in-root-citations-citationsmd>In Root Citations (CITATIONS.md)<a href=#in-root-citations-citationsmd class=hash-link aria-label="Direct link to In Root Citations (CITATIONS.md)" title="Direct link to In Root Citations (CITATIONS.md)" translate=no>β</a></h3>
<ul>
<li class="">β
<strong>OpenStates/Plural Policy</strong> main site</li>
<li class="">β
<strong>Bulk data downloads</strong> (CSV, JSON, PostgreSQL)</li>
<li class="">β
<strong>Scrapers repository</strong>: <a href=https://github.com/openstates/openstates-scrapers target=_blank rel="noopener noreferrer" class="">https://github.com/openstates/openstates-scrapers</a></li>
<li class="">β
<strong>Local database documentation</strong>: <a href=https://docs.openstates.org/contributing/local-database/ target=_blank rel="noopener noreferrer" class="">https://docs.openstates.org/contributing/local-database/</a></li>
<li class="">β
<strong>Code of Conduct</strong>: <a href=https://docs.openstates.org/code-of-conduct/ target=_blank rel="noopener noreferrer" class="">https://docs.openstates.org/code-of-conduct/</a></li>
<li class="">β
<strong>Schema documentation</strong>: <a href=https://github.com/openstates/people/blob/master/schema.md target=_blank rel="noopener noreferrer" class="">https://github.com/openstates/people/blob/master/schema.md</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=in-website-documentation-websitedocsdata-sourcescitationsmd>In Website Documentation (website/docs/data-sources/citations.md)<a href=#in-website-documentation-websitedocsdata-sourcescitationsmd class=hash-link aria-label="Direct link to In Website Documentation (website/docs/data-sources/citations.md)" title="Direct link to In Website Documentation (website/docs/data-sources/citations.md)" translate=no>β</a></h3>
<ul>
<li class="">β
Comprehensive OpenStates/Plural Policy section</li>
<li class="">β
PostgreSQL dump setup instructions</li>
<li class="">β
Contribution guidelines</li>
<li class="">β
BibTeX citation</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=in-contributing-guide-contributingmd>In Contributing Guide (CONTRIBUTING.md)<a href=#in-contributing-guide-contributingmd class=hash-link aria-label="Direct link to In Contributing Guide (CONTRIBUTING.md)" title="Direct link to In Contributing Guide (CONTRIBUTING.md)" translate=no>β</a></h3>
<ul>
<li class="">β
Code of Conduct alignment with OpenStates</li>
<li class="">β
Upstream contribution guidelines</li>
<li class="">β
Testing requirements for scraper contributions</li>
</ul>
<hr/>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-our-current-openstates-integration>π Our Current OpenStates Integration<a href=#-our-current-openstates-integration class=hash-link aria-label="Direct link to π Our Current OpenStates Integration" title="Direct link to π Our Current OpenStates Integration" translate=no>β</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=data-we-use>Data We Use<a href=#data-we-use class=hash-link aria-label="Direct link to Data We Use" title="Direct link to Data We Use" translate=no>β</a></h3>
<ol>
<li class="">
<p><strong>PostgreSQL Monthly Dumps</strong> (9.8GB+)</p>
<ul>
<li class="">Complete legislative database for all 50 states</li>
<li class="">Script: <code>scripts/bulk_legislative_download.py --postgres --month 2026-04</code></li>
<li class="">Setup: <code>scripts/setup_openstates_db.sh</code></li>
<li class="">Use: Local SQL queries, no API rate limits</li>
</ul>
</li>
<li class="">
<p><strong>CSV/JSON Session Data</strong></p>
<ul>
<li class="">Per-state legislative sessions</li>
<li class="">Bill text, votes, sponsors</li>
<li class="">Committee assignments</li>
</ul>
</li>
<li class="">
<p><strong>Video Sources</strong></p>
<ul>
<li class="">YouTube channel URLs from <code>sources</code> field</li>
<li class="">Granicus video portal links</li>
<li class="">Meeting archive locations</li>
</ul>
</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=our-implementation>Our Implementation<a href=#our-implementation class=hash-link aria-label="Direct link to Our Implementation" title="Direct link to Our Implementation" translate=no>β</a></h3>
<p><strong>File:</strong> <code>discovery/openstates_sources.py</code></p>
<ul>
<li class="">Fetches jurisdiction data via API</li>
<li class="">Extracts video sources (YouTube, Vimeo, Granicus)</li>
<li class="">Maps to our jurisdiction database</li>
</ul>
<p><strong>File:</strong> <code>scripts/bulk_legislative_download.py</code></p>
<ul>
<li class="">Downloads PostgreSQL dumps</li>
<li class="">Downloads CSV/JSON session data</li>
<li class="">Handles all 50 states + DC + PR</li>
</ul>
<hr/>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-code-we-could-contribute-to-openstates-scrapers>π€ Code We Could Contribute to OpenStates Scrapers<a href=#-code-we-could-contribute-to-openstates-scrapers class=hash-link aria-label="Direct link to π€ Code We Could Contribute to OpenStates Scrapers" title="Direct link to π€ Code We Could Contribute to OpenStates Scrapers" translate=no>β</a></h2>
<p>The <a href=https://github.com/openstates/openstates-scrapers target=_blank rel="noopener noreferrer" class="">openstates-scrapers</a> repository uses <strong>Scrapy</strong> to collect legislative data. We have complementary code that could enhance their project:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=1-video-source-discovery-patterns>1. Video Source Discovery Patterns<a href=#1-video-source-discovery-patterns class=hash-link aria-label="Direct link to 1. Video Source Discovery Patterns" title="Direct link to 1. Video Source Discovery Patterns" translate=no>β</a></h3>
<p><strong>Our Code:</strong> <code>discovery/youtube_channel_discovery.py</code></p>
<p><strong>What it does:</strong></p>
<ul>
<li class="">Finds <strong>all</strong> YouTube channels for a jurisdiction (not just first match)</li>
<li class="">Scrapes homepages for YouTube links</li>
<li class="">Uses YouTube Data API for verification</li>
<li class="">Discovers Vimeo and Granicus portals</li>
</ul>
<p><strong>Potential Contribution:</strong></p>
<ul>
<li class="">Add video source extraction to OpenStates scrapers</li>
<li class="">Enhance <code>sources</code> field with verified YouTube channels</li>
<li class="">Automate Granicus portal discovery</li>
</ul>
<p><strong>Example Pattern:</strong></p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token comment" style=color:#999988;font-style:italic># Our code finds these patterns</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">patterns </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token string" style=color:#e3116c>"youtube_channel"</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>r"youtube\.com/(?:c/|channel/|user/|@)([\w-]+)"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token string" style=color:#e3116c>"vimeo_channel"</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>r"vimeo\.com/([\w-]+)"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token string" style=color:#e3116c>"granicus"</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>r"granicus\.com/([^/]+)"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=2-legistargranicus-platform-detection>2. Legistar/Granicus Platform Detection<a href=#2-legistargranicus-platform-detection class=hash-link aria-label="Direct link to 2. Legistar/Granicus Platform Detection" title="Direct link to 2. Legistar/Granicus Platform Detection" translate=no>β</a></h3>
<p><strong>Our Code:</strong> <code>discovery/url_discovery_agent.py</code></p>
<p><strong>What it does:</strong></p>
<ul>
<li class="">Identifies Legistar instances across cities</li>
<li class="">Maps Granicus video portals</li>
<li class="">Extracts meeting URLs and agendas</li>
</ul>
<p><strong>Potential Contribution:</strong></p>
<ul>
<li class="">Enhance OpenStates scrapers with meeting video links</li>
<li class="">Add Legistar meeting agenda extraction</li>
<li class="">Contribute URL validation patterns</li>
</ul>
<p><strong>Platform Patterns We Use:</strong></p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain">platforms </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token string" style=color:#e3116c>"granicus"</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>[</span><span class="token string" style=color:#e3116c>"granicus.com"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"legistar.com"</span><span class="token punctuation" style=color:#393A34>]</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token string" style=color:#e3116c>"youtube"</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>[</span><span class="token string" style=color:#e3116c>"youtube.com"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"youtu.be"</span><span class="token punctuation" style=color:#393A34>]</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token string" style=color:#e3116c>"vimeo"</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>[</span><span class="token string" style=color:#e3116c>"vimeo.com"</span><span class="token punctuation" style=color:#393A34>]</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=3-meeting-archive-scraping>3. Meeting Archive Scraping<a href=#3-meeting-archive-scraping class=hash-link aria-label="Direct link to 3. Meeting Archive Scraping" title="Direct link to 3. Meeting Archive Scraping" translate=no>β</a></h3>
<p><strong>Our Code:</strong> <code>agents/scraper.py</code></p>
<p><strong>What it does:</strong></p>
<ul>
<li class="">Scrapes PDF meeting minutes</li>
<li class="">Extracts text from scanned documents (OCR)</li>
<li class="">Parses meeting dates and types</li>
<li class="">Handles multiple document formats</li>
</ul>
<p><strong>Potential Contribution:</strong></p>
<ul>
<li class="">Add meeting minutes text extraction to OpenStates</li>
<li class="">Enhance bill analysis with meeting context</li>
<li class="">Link bills to meeting discussions</li>
</ul>
<hr/>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-how-to-contribute-to-openstates-scrapers>π How to Contribute to OpenStates Scrapers<a href=#-how-to-contribute-to-openstates-scrapers class=hash-link aria-label="Direct link to π How to Contribute to OpenStates Scrapers" title="Direct link to π How to Contribute to OpenStates Scrapers" translate=no>β</a></h2>
<p>Following their <a href=https://docs.openstates.org/contributing/local-database/ target=_blank rel="noopener noreferrer" class="">local database documentation</a>:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=1-setup-openstates-development-environment>1. Setup OpenStates Development Environment<a href=#1-setup-openstates-development-environment class=hash-link aria-label="Direct link to 1. Setup OpenStates Development Environment" title="Direct link to 1. Setup OpenStates Development Environment" translate=no>β</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain"># Clone the scrapers repository</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">git clone https://github.com/openstates/openstates-scrapers.git</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">cd openstates-scrapers</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># Install dependencies</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">pip install -r requirements.txt</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># Setup local PostgreSQL database</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">createdb openstates</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># Import schema (if needed)</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">psql -d openstates -f schema/openstates.sql</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=2-test-your-scraper-locally>2. Test Your Scraper Locally<a href=#2-test-your-scraper-locally class=hash-link aria-label="Direct link to 2. Test Your Scraper Locally" title="Direct link to 2. Test Your Scraper Locally" translate=no>β</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain"># Run a specific state scraper</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">os-update al --scrape --rpm 10</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># Validate data</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">os-update al --scrape --validate</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=3-follow-their-code-of-conduct>3. Follow Their Code of Conduct<a href=#3-follow-their-code-of-conduct class=hash-link aria-label="Direct link to 3. Follow Their Code of Conduct" title="Direct link to 3. Follow Their Code of Conduct" translate=no>β</a></h3>
<p>All contributions must follow the <a href=https://docs.openstates.org/code-of-conduct/ target=_blank rel="noopener noreferrer" class="">OpenStates Code of Conduct</a>:</p>
<ul>
<li class="">Be respectful and professional</li>
<li class="">Welcome diverse perspectives</li>
<li class="">Focus on what's best for the community</li>
<li class="">Show empathy towards other contributors</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=4-submit-pull-request>4. Submit Pull Request<a href=#4-submit-pull-request class=hash-link aria-label="Direct link to 4. Submit Pull Request" title="Direct link to 4. Submit Pull Request" translate=no>β</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain"># Create feature branch</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">git checkout -b feature/video-sources</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># Make changes (add video discovery to a state scraper)</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># Example: scrapers/al/videos.py</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># Test thoroughly</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">os-update al --scrape --rpm 10</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># Commit and push</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">git commit -m "Add video source discovery for Alabama legislature"</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">git push origin feature/video-sources</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"># Open PR on GitHub</span><br/></div></code></pre></div></div>
<hr/>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-specific-contribution-ideas>π― Specific Contribution Ideas<a href=#-specific-contribution-ideas class=hash-link aria-label="Direct link to π― Specific Contribution Ideas" title="Direct link to π― Specific Contribution Ideas" translate=no>β</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=priority-1-add-video-sources-to-scrapers>Priority 1: Add Video Sources to Scrapers<a href=#priority-1-add-video-sources-to-scrapers class=hash-link aria-label="Direct link to Priority 1: Add Video Sources to Scrapers" title="Direct link to Priority 1: Add Video Sources to Scrapers" translate=no>β</a></h3>
<p><strong>Goal:</strong> Enhance the <code>sources</code> field with verified video links</p>
<p><strong>States to Start With:</strong></p>
<ul>
<li class=""><strong>Alabama</strong> - Has YouTube channel, needs verification</li>
<li class=""><strong>California</strong> - @CALegislature (well-documented)</li>
<li class=""><strong>Texas</strong> - Multiple chambers on YouTube</li>
<li class=""><strong>New York</strong> - Both Assembly and Senate channels</li>
</ul>
<p><strong>Implementation:</strong></p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token comment" style=color:#999988;font-style:italic># In scrapers/al/__init__.py</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>class</span><span class="token plain"> </span><span class="token class-name">AlabamaScraper</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">BaseScraper</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>scrape_sources</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">self</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token triple-quoted-string string" style=color:#e3116c>"""Add video sources for Alabama legislature."""</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>return</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token string" style=color:#e3116c>"youtube"</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"https://www.youtube.com/@AlabamaLegislature"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token string" style=color:#e3116c>"granicus"</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"https://alabama.granicus.com/ViewPublisher.php?view_id=6"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=priority-2-meeting-minutes-integration>Priority 2: Meeting Minutes Integration<a href=#priority-2-meeting-minutes-integration class=hash-link aria-label="Direct link to Priority 2: Meeting Minutes Integration" title="Direct link to Priority 2: Meeting Minutes Integration" translate=no>β</a></h3>
<p><strong>Goal:</strong> Link bills to meeting discussions</p>
<p><strong>Use Case:</strong></p>
<ul>
<li class="">When bill HB123 is discussed in committee</li>
<li class="">Link to YouTube timestamp of discussion</li>
<li class="">Extract quotes from meeting minutes</li>
<li class="">Connect legislators' comments to votes</li>
</ul>
<p><strong>Implementation:</strong></p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-python codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token comment" style=color:#999988;font-style:italic># Add meeting metadata to bill objects</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">bill</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">add_source</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> url</span><span class="token operator" style=color:#393A34>=</span><span class="token string" style=color:#e3116c>"https://www.youtube.com/watch?v=xyz&t=1234s"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> note</span><span class="token operator" style=color:#393A34>=</span><span class="token string" style=color:#e3116c>"Committee discussion at 20:34"</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>)</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=priority-3-granicus-portal-scraping>Priority 3: Granicus Portal Scraping<a href=#priority-3-granicus-portal-scraping class=hash-link aria-label="Direct link to Priority 3: Granicus Portal Scraping" title="Direct link to Priority 3: Granicus Portal Scraping" translate=no>β</a></h3>
<p><strong>Goal:</strong> Automate discovery of Granicus video portals</p>
<p><strong>Pattern:</strong></p>
<ul>
<li class="">Many jurisdictions use Granicus for meeting videos</li>
<li class="">URLs follow pattern: <code>{jurisdiction}.granicus.com/ViewPublisher.php?view_id={id}</code></li>
<li class="">Could automate discovery and link to OpenStates jurisdictions</li>
</ul>
<hr/>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-license-compatibility>π License Compatibility<a href=#-license-compatibility class=hash-link aria-label="Direct link to π License Compatibility" title="Direct link to π License Compatibility" translate=no>β</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=our-license>Our License<a href=#our-license class=hash-link aria-label="Direct link to Our License" title="Direct link to Our License" translate=no>β</a></h3>
<ul>
<li class=""><strong>Code:</strong> Open source (check root LICENSE file)</li>
<li class=""><strong>Data:</strong> Citations required (see CITATIONS.md)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=openstates-license>OpenStates License<a href=#openstates-license class=hash-link aria-label="Direct link to OpenStates License" title="Direct link to OpenStates License" translate=no>β</a></h3>
<ul>
<li class=""><strong>Code:</strong> BSD-style license (permissive)</li>
<li class=""><strong>Data:</strong> Public domain (bulk downloads)</li>
<li class=""><strong>Content:</strong> Varies by state (some restrictions)</li>
</ul>
<p>β
<strong>Compatible:</strong> Our code contributions would be compatible with their license.</p>
<hr/>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-required-reading-before-contributing>π Required Reading Before Contributing<a href=#-required-reading-before-contributing class=hash-link aria-label="Direct link to π Required Reading Before Contributing" title="Direct link to π Required Reading Before Contributing" translate=no>β</a></h2>
<p>Before submitting any code to OpenStates, review:</p>
<ol>
<li class="">
<p><strong>Local Database Setup</strong>: <a href=https://docs.openstates.org/contributing/local-database/ target=_blank rel="noopener noreferrer" class="">https://docs.openstates.org/contributing/local-database/</a></p>
<ul>
<li class="">How to set up PostgreSQL locally</li>
<li class="">How to run scrapers in development</li>
<li class="">How to test data quality</li>
</ul>
</li>
<li class="">
<p><strong>Scraper Development Guide</strong>: <a href=https://docs.openstates.org/contributing/scrapers/ target=_blank rel="noopener noreferrer" class="">https://docs.openstates.org/contributing/scrapers/</a></p>
<ul>
<li class="">Scrapy patterns used</li>
<li class="">Data validation requirements</li>
<li class="">Testing procedures</li>
</ul>
</li>
<li class="">
<p><strong>Code of Conduct</strong>: <a href=https://docs.openstates.org/code-of-conduct/ target=_blank rel="noopener noreferrer" class="">https://docs.openstates.org/code-of-conduct/</a></p>
<ul>
<li class="">Community standards</li>
<li class="">Communication guidelines</li>
<li class="">Enforcement policies</li>
</ul>
</li>
<li class="">
<p><strong>Schema Documentation</strong>: <a href=https://github.com/openstates/people/blob/master/schema.md target=_blank rel="noopener noreferrer" class="">https://github.com/openstates/people/blob/master/schema.md</a></p>
<ul>
<li class="">Data model structure</li>
<li class="">Required vs optional fields</li>
<li class="">Relationship patterns</li>
</ul>
</li>
</ol>
<hr/>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-next-steps>π Next Steps<a href=#-next-steps class=hash-link aria-label="Direct link to π Next Steps" title="Direct link to π Next Steps" translate=no>β</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=for-this-project>For This Project<a href=#for-this-project class=hash-link aria-label="Direct link to For This Project" title="Direct link to For This Project" translate=no>β</a></h3>
<ol>
<li class="">β
<strong>Citations Added</strong> - OpenStates properly credited</li>
<li class="">β
<strong>Code of Conduct</strong> - Aligned with their standards</li>
<li class="">β
<strong>Local Database</strong> - PostgreSQL dumps integrated</li>
<li class="">β³ <strong>Test Contributions</strong> - Validate our code works with their schema</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=for-community-contribution>For Community Contribution<a href=#for-community-contribution class=hash-link aria-label="Direct link to For Community Contribution" title="Direct link to For Community Contribution" translate=no>β</a></h3>
<ol>
<li class=""><strong>Identify Target State</strong> - Choose state needing video sources</li>
<li class=""><strong>Test Locally</strong> - Set up OpenStates dev environment</li>
<li class=""><strong>Develop Scraper</strong> - Add video discovery code</li>
<li class=""><strong>Submit PR</strong> - Follow their contribution guidelines</li>
<li class=""><strong>Iterate</strong> - Respond to code review feedback</li>
</ol>
<hr/>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-benefits-of-contributing>π‘ Benefits of Contributing<a href=#-benefits-of-contributing class=hash-link aria-label="Direct link to π‘ Benefits of Contributing" title="Direct link to π‘ Benefits of Contributing" translate=no>β</a></h2>
<p><strong>For OpenStates:</strong></p>
<ul>
<li class="">Enhanced video source coverage</li>
<li class="">Better meeting-to-bill linkage</li>
<li class="">More comprehensive legislative tracking</li>
</ul>
<p><strong>For Our Project:</strong></p>
<ul>
<li class="">Upstream improvements benefit us</li>
<li class="">Community recognition</li>
<li class="">Better data quality for all users</li>
</ul>
<p><strong>For Civic Tech:</strong></p>
<ul>
<li class="">Shared infrastructure improvements</li>
<li class="">Reduced duplication of effort</li>
<li class="">Stronger open-source ecosystem</li>
</ul>
<hr/>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-questions>π Questions?<a href=#-questions class=hash-link aria-label="Direct link to π Questions?" title="Direct link to π Questions?" translate=no>β</a></h2>
<ul>
<li class=""><strong>OpenStates Discord</strong>: <a href=https://discord.gg/openstates target=_blank rel="noopener noreferrer" class="">https://discord.gg/openstates</a></li>
<li class=""><strong>GitHub Discussions</strong>: <a href=https://github.com/openstates/openstates-scrapers/discussions target=_blank rel="noopener noreferrer" class="">https://github.com/openstates/openstates-scrapers/discussions</a></li>
<li class=""><strong>Email</strong>: Open States team (check repository for contact info)</li>
</ul>
<hr/>
<p><strong>Last Updated:</strong> April 29, 2026<br/>
<strong>Maintained By:</strong> Open Navigator team</div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col noPrint_WFHX"><a href=https://github.com/getcommunityone/open-navigator-for-engagement/tree/main/website/docs/development/openstates-integration.md target=_blank rel="noopener noreferrer" class=theme-edit-this-page><svg fill=currentColor height=20 width=20 viewBox="0 0 40 40" class=iconEdit_Z9Sw aria-hidden=true><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"/></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href=/docs/development/api-logging-errors><div class=pagination-nav__sublabel>Previous</div><div class=pagination-nav__label>API Logging & Error Handling Implementation</div></a><a class="pagination-nav__link pagination-nav__link--next" href=/docs/development/real-time-statistics><div class=pagination-nav__sublabel>Next</div><div class=pagination-nav__label>Real-Time Statistics with Geographic Filtering</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href=#-references-added-to-citations class="table-of-contents__link toc-highlight">π References Added to Citations</a><ul><li><a href=#in-root-citations-citationsmd class="table-of-contents__link toc-highlight">In Root Citations (CITATIONS.md)</a><li><a href=#in-website-documentation-websitedocsdata-sourcescitationsmd class="table-of-contents__link toc-highlight">In Website Documentation (website/docs/data-sources/citations.md)</a><li><a href=#in-contributing-guide-contributingmd class="table-of-contents__link toc-highlight">In Contributing Guide (CONTRIBUTING.md)</a></ul><li><a href=#-our-current-openstates-integration class="table-of-contents__link toc-highlight">π Our Current OpenStates Integration</a><ul><li><a href=#data-we-use class="table-of-contents__link toc-highlight">Data We Use</a><li><a href=#our-implementation class="table-of-contents__link toc-highlight">Our Implementation</a></ul><li><a href=#-code-we-could-contribute-to-openstates-scrapers class="table-of-contents__link toc-highlight">π€ Code We Could Contribute to OpenStates Scrapers</a><ul><li><a href=#1-video-source-discovery-patterns class="table-of-contents__link toc-highlight">1. Video Source Discovery Patterns</a><li><a href=#2-legistargranicus-platform-detection class="table-of-contents__link toc-highlight">2. Legistar/Granicus Platform Detection</a><li><a href=#3-meeting-archive-scraping class="table-of-contents__link toc-highlight">3. Meeting Archive Scraping</a></ul><li><a href=#-how-to-contribute-to-openstates-scrapers class="table-of-contents__link toc-highlight">π How to Contribute to OpenStates Scrapers</a><ul><li><a href=#1-setup-openstates-development-environment class="table-of-contents__link toc-highlight">1. Setup OpenStates Development Environment</a><li><a href=#2-test-your-scraper-locally class="table-of-contents__link toc-highlight">2. Test Your Scraper Locally</a><li><a href=#3-follow-their-code-of-conduct class="table-of-contents__link toc-highlight">3. Follow Their Code of Conduct</a><li><a href=#4-submit-pull-request class="table-of-contents__link toc-highlight">4. Submit Pull Request</a></ul><li><a href=#-specific-contribution-ideas class="table-of-contents__link toc-highlight">π― Specific Contribution Ideas</a><ul><li><a href=#priority-1-add-video-sources-to-scrapers class="table-of-contents__link toc-highlight">Priority 1: Add Video Sources to Scrapers</a><li><a href=#priority-2-meeting-minutes-integration class="table-of-contents__link toc-highlight">Priority 2: Meeting Minutes Integration</a><li><a href=#priority-3-granicus-portal-scraping class="table-of-contents__link toc-highlight">Priority 3: Granicus Portal Scraping</a></ul><li><a href=#-license-compatibility class="table-of-contents__link toc-highlight">π License Compatibility</a><ul><li><a href=#our-license class="table-of-contents__link toc-highlight">Our License</a><li><a href=#openstates-license class="table-of-contents__link toc-highlight">OpenStates License</a></ul><li><a href=#-required-reading-before-contributing class="table-of-contents__link toc-highlight">π Required Reading Before Contributing</a><li><a href=#-next-steps class="table-of-contents__link toc-highlight">π Next Steps</a><ul><li><a href=#for-this-project class="table-of-contents__link toc-highlight">For This Project</a><li><a href=#for-community-contribution class="table-of-contents__link toc-highlight">For Community Contribution</a></ul><li><a href=#-benefits-of-contributing class="table-of-contents__link toc-highlight">π‘ Benefits of Contributing</a><li><a href=#-questions class="table-of-contents__link toc-highlight">π Questions?</a></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class=footer__title>Documentation</div><ul class="footer__items clean-list"><li class=footer__item><a class=footer__link-item href=/docs/intro>Getting Started</a><li class=footer__item><a class=footer__link-item href=/docs/data-sources/citations>Citations & Data Sources</a><li class=footer__item><a class=footer__link-item href=/docs/data-sources/overview>Data Sources</a><li class=footer__item><a class=footer__link-item href=/docs/for-developers>For Developers</a></ul></div><div class="theme-layout-footer-column col footer__col"><div class=footer__title>Resources</div><ul class="footer__items clean-list"><li class=footer__item><a href=https://www.communityone.com target=_blank rel="noopener noreferrer" class=footer__link-item>Launch Open Navigator<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li class=footer__item><a href=https://github.com/getcommunityone/open-navigator-for-engagement target=_blank rel="noopener noreferrer" class=footer__link-item>GitHub<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li class=footer__item><a href=https://www.groundvue.org/ target=_blank rel="noopener noreferrer" class=footer__link-item>GroundVue (Partner)<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a></ul></div><div class="theme-layout-footer-column col footer__col"><div class=footer__title>Community</div><ul class="footer__items clean-list"><li class=footer__item><a href=https://www.instagram.com/getcommunityone/ target=_blank rel="noopener noreferrer" class=footer__link-item>Instagram<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li class=footer__item><a href=https://www.facebook.com/getcommunityone target=_blank rel="noopener noreferrer" class=footer__link-item>Facebook<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li class=footer__item><a href=https://x.com/getcommunityone/ target=_blank rel="noopener noreferrer" class=footer__link-item>X (Twitter)<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li class=footer__item><a href=https://www.linkedin.com/company/getcommunityone target=_blank rel="noopener noreferrer" class=footer__link-item>LinkedIn<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li class=footer__item><a href=https://www.youtube.com/@getcommunityone target=_blank rel="noopener noreferrer" class=footer__link-item>YouTube<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li class=footer__item><a href=https://discord.gg/uH6Dytek target=_blank rel="noopener noreferrer" class=footer__link-item>Discord<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a></ul></div><div class="theme-layout-footer-column col footer__col"><div class=footer__title>Legal</div><ul class="footer__items clean-list"><li class=footer__item><a class=footer__link-item href=/docs/legal/privacy-policy>Privacy Policy</a><li class=footer__item><a class=footer__link-item href=/docs/legal/terms-of-service>Terms of Service</a><li class=footer__item><a class=footer__link-item href=/docs/legal/data-provider-terms>Data Provider Terms</a></ul></div><div class="theme-layout-footer-column col footer__col"><div class=footer__title>More</div><ul class="footer__items clean-list"><li class=footer__item><a class=footer__link-item href=/blog>Blog</a><li class=footer__item><a href=https://github.com/getcommunityone/open-navigator-for-engagement/blob/main/LICENSE target=_blank rel="noopener noreferrer" class=footer__link-item>License (MIT)<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a></ul></div></div><div class="footer__bottom text--center"><div class=footer__copyright>Copyright Β© 2026 Community One. Built with Docusaurus.</div></div></div></footer></div></body> |