Reflex Logo
Blog
Builder
Squares Vertical DocsSquares Vertical Docs

How to Build a Dashboard With Linear in 2026

Learn how to build a Linear dashboard with Python in April 2026. Query the GraphQL API and display data with tables, charts, and stat cards.

Tom Gotsman

TLDR:

  • You can build Linear dashboards in pure Python with Reflex by querying the GraphQL API and displaying data through built-in tables, charts, and stat cards.
  • Reflex's event-driven architecture handles Linear data refreshes without re-running your entire script, avoiding Streamlit's memory issues at scale.
  • Deploy with reflex deploy to ship your full-stack dashboard in one command, with VPC and on-premises options for enterprise compliance.
  • Reflex is a full-stack Python framework that lets you build web apps entirely in Python without JavaScript, used by 40% of Fortune 500 companies.

Linear's GraphQL API gives you read access to issues, projects, teams, cycles, and users, the same API Linear uses internally. That data richness makes it a strong foundation for analytics dashboards, though the real question is what you actually build with it.

The most common starting point is sprint velocity tracking: pulling cycle data across multiple sprints and charting completion rates over time. From there, most teams add burndown charts, issue assignment distributions, and project milestone progress bars. Engineering managers use these to spot capacity imbalances before they become blockers, while product managers rely on delivery timelines to set realistic stakeholder expectations.

A well-built Linear dashboard typically serves three audiences at once:

  • Engineering managers monitoring team workload and cycle health across active sprints
  • Product managers tracking feature delivery against release milestones and deadlines
  • Cross-functional stakeholders who need release progress without needing a Linear seat

Reflex's 60+ built-in components, including charts, tables, and stat cards, map cleanly onto these use cases. You can build issue status pipelines as kanban-style views, render workload comparisons as bar charts, or surface cycle completion rates as stat cards. All of it in pure Python, no JavaScript required. Components compose into multi-page layouts if your dashboard grows beyond a single view.

Python developers working with Linear's API typically have the hard part solved: writing GraphQL queries, reshaping issue data, and aggregating metrics across cycles. What slows them down is the frontend. React, TypeScript, bundlers, state synchronization between client and server. None of that is the interesting problem.

Reflex removes that entirely. Your GraphQL queries to Linear's API, your filtering and aggregation logic, and your UI components all live in the same Python file. Linear's GraphQL API delivers fast response times, so the bottleneck is never the data layer. It's the scaffolding around it. Reflex's state management uses Python classes and event handlers, with WebSocket connections pushing updates to the browser automatically, no polling required.

Streamlit runs your entire script on every interaction, which causes memory issues as dashboards scale. That's a real problem for dashboards refreshing Linear data frequently. Reflex's event-driven architecture handles discrete state changes instead, so only the relevant components re-render when an event fires.

The World Bank achieved 12x development speed switching from Streamlit to Reflex, shipping multiple production apps independently without frontend expertise. That outcome makes sense when the entire stack speaks one language.

Reflex's Python backend means there's no separate API layer to configure. Any Python library on PyPI works directly inside Reflex event handlers, which is where your Linear queries live alongside your state management code.

Linear provides a GraphQL API endpoint that supports both personal API keys and OAuth2 authentication. Personal API keys work well during development. OAuth2 is the better choice for production deployments where multiple users or services need scoped access. The linear-api package on PyPI gives Python developers a starting point for calling Linear's API without writing raw GraphQL from scratch.

The integration architecture is straightforward. Your Reflex event handlers call the Linear API directly, store the response in your app's state, and the UI updates automatically. No middleware, no REST wrapper, no separate microservice. API credentials stay in environment variables during local development, or in Reflex's project-level integration configuration for production, where credentials are shared automatically across every app in a project.

Because everything runs server-side in Python, your Linear API keys never touch the browser. State lives on the backend, which means sensitive credentials stay exactly where they should.

For teams managing multiple dashboards, the project-level configuration matters. Set your Linear credentials once, and every app in that project inherits them without manual reconfiguration. That setup also makes forking dashboards for different teams or clients much cleaner, since integrations carry over automatically.

Reflex's 60+ built-in components map cleanly onto the data structures Linear's API returns. The question is just picking the right component for each data shape.

Linear issue data is inherently tabular: titles, assignees, status, priority, estimates, labels. The ``rx.data_table component displays this natively with sortable and filterable columns. Computed vars let you aggregate issue counts by status or calculate per-assignee workload directly from your Linear query response, with the UI staying in sync automatically whenever the underlying state changes.

Three chart types cover most Linear analytics needs. Line charts handle burndown tracking across a cycle's duration. Bar charts compare completed versus planned story points across sprints or teams. Pie charts break down issue distribution by priority or label. Reflex's chart components accept standard Python data structures, so converting a Linear GraphQL response into chart-ready format is just list comprehension and dictionary operations.

Stat cards carry the metrics stakeholders check first: open issue count, average cycle time, issues closed this week, percentage of on-track projects. The rx.stat component updates reactively when your event handler re-fetches Linear data on a schedule or user trigger, reflecting the latest numbers without a page reload.

Component TypeLinear DataReflex ComponentUse Case
TableIssues, assigneesrx.data_tableDisplay filterable issue lists with status and priority
Line ChartCycle burndownrx.recharts.line_chartTrack remaining work across sprint timeline
Bar ChartTeam velocityrx.recharts.bar_chartCompare story points completed per team
Stat CardMetric summariesrx.statShow total open issues and cycle completion rate

Shipping a Reflex dashboard to production skips the usual split-pipeline problem. One command packages the full-stack app, Linear integration logic included, and deploys it. No separate frontend build, no backend service configuration, no infrastructure coordination.

For teams needing low latency or compliance controls, the deployment options scale accordingly. Multi-region deployment keeps the dashboard responsive regardless of where your engineering teams are located. CI/CD integration with GitHub Actions and GitLab CI means every merged code change redeploys automatically. Enterprise teams handling sensitive project data can route to VPC or on-premises hosting instead, keeping Linear data inside their own security perimeter.

Production observability comes included via OpenTelemetry, covering performance metrics, distributed tracing, and log aggregation through Reflex Cloud. For teams unfamiliar with observability tooling, production monitoring best practices focus on tracking latency, traffic, errors, and saturation across your deployment.

Yes. Reflex lets you build full Linear integrations in pure Python, including GraphQL queries, state management, and UI components. Your Linear API calls, data transformations, and dashboard components all live in the same Python file without writing any JavaScript.

Streamlit reruns your entire script on every interaction, causing memory issues as dashboards scale with frequent Linear data refreshes. Reflex uses event-driven architecture where only relevant components re-render, making it better for production dashboards that need reliable performance under load.

Your Reflex event handlers call Linear's API directly using any Python library from PyPI, like the linear-api package. API credentials stay in environment variables or Reflex's project-level integration configuration, which automatically shares credentials across all apps in your project. All API calls run server-side, so your Linear API keys never reach the browser.

Tables (rx.data_table) work for issue lists with sortable columns, line charts handle sprint burndowns, bar charts compare velocity across teams, and stat cards display key metrics like open issue counts. Reflex's 60+ built-in components accept standard Python data structures, so converting Linear's GraphQL responses is just dictionary operations and list comprehension.

If your engineering team handles sensitive project data requiring compliance controls or internal security policies prohibit external hosting, VPC or on-premises deployment keeps Linear data inside your security perimeter. Multi-region deployment on standard cloud hosting works well for distributed teams needing low latency without compliance restrictions.

Built with Reflex