Linear
Project Management Tool
Linear
Overview
Linear is a high-speed issue tracking tool specialized for development teams. It integrates sprint management, product roadmaps, and bug tracking, featuring simple UX and high performance. Designed to eliminate the complexity of traditional project management tools, it focuses on features that developers truly need.
Details
Linear is designed to meet the needs of modern software development teams, emphasizing fast operation and clean interface. Deep integration with development tools like GitHub and Slack allows for issue management without interrupting development workflows.
Key Features
- High Performance: Instant page loads and responsive interface
- Modern UX: Intuitive and beautiful design with excellent usability
- Powerful Integrations: Integration with GitHub, GitLab, Slack, Figma, Zapier, and more
- AI Features: Automatic issue classification and smart suggestion features
- Triage Functionality: Efficient issue prioritization and categorization
- Roadmap Management: Visual product roadmap creation
- API-first Design: Flexible automation and customization through GraphQL API
Target Teams
- Software development teams
- Product teams
- Startups to large enterprises
- Agile/Scrum development teams
Pros and Cons
Pros
- Remarkable speed and responsiveness
- Developer-friendly interface design
- Powerful bidirectional GitHub sync functionality
- High-efficiency operation through keyboard shortcuts
- Simple and intuitive workflow configuration
- Excellent mobile app and offline support
Cons
- Simple features may not suit complex project management
- Limited customization options
- Non-technical teams may find features insufficient
- Limited integration with other enterprise tools
- Lacks management features for large organizations
- Incomplete Japanese language support
Reference Pages
- Linear Official Website
- Linear Documentation
- Linear API Reference
- Linear Blog
- Linear Help Center
- Linear GraphQL Playground
Code Examples
Basic Setup
# Install Linear CLI
npm install -g @linear/cli
# Setup authentication
linear auth
# Initialize project
linear init
# Check configuration
linear config
Project Creation
// Linear GraphQL API - Team Creation
import { LinearClient } from '@linear/sdk';
const linear = new LinearClient({
apiKey: process.env.LINEAR_API_KEY
});
// Create new team
const teamCreateResponse = await linear.createTeam({
name: "Product Team",
key: "PROD",
description: "Product development team",
private: false,
autoArchivePeriod: 3,
autoCloseStateId: "completed-state-id"
});
// Create project
const projectCreateResponse = await linear.createProject({
name: "Mobile App v2.0",
description: "Development of next version mobile app",
teamIds: [teamCreateResponse.team?.id],
targetDate: new Date('2024-12-31'),
state: "planned"
});
Issue Management
// Issue Creation
const issueCreateResponse = await linear.createIssue({
title: "Implement user authentication feature",
description: `
## Requirements
- OAuth 2.0 authentication
- JWT token session management
- Multi-factor authentication support
## Acceptance Criteria
- [ ] Login/logout functionality
- [ ] Password reset functionality
- [ ] Profile management screen
`,
teamId: "team-id",
assigneeId: "user-id",
priorityLevel: 1, // 0: No priority, 1: Urgent, 2: High, 3: Medium, 4: Low
labelIds: ["backend-label-id", "security-label-id"],
projectId: "project-id",
estimate: 5 // Story points
});
// Issue Update
const issueUpdateResponse = await linear.updateIssue(issueId, {
stateId: "in-progress-state-id",
assigneeId: "new-assignee-id",
priorityLevel: 2,
estimate: 8
});
// Sub-issue Creation
const subIssueResponse = await linear.createIssue({
title: "Implement OAuth provider",
teamId: "team-id",
parentId: issueCreateResponse.issue?.id
});
Workflow Configuration
// Custom Workflow State Creation
const workflowStateResponse = await linear.createWorkflowState({
name: "Design Review",
description: "State requiring design review",
color: "#f59e0b",
teamId: "team-id",
type: "started", // backlog, unstarted, started, completed, canceled
position: 2
});
// Label Creation
const labelResponse = await linear.createIssueLabel({
name: "Bug",
description: "Bug report",
color: "#ef4444",
teamId: "team-id"
});
// Custom View Creation
const customViewResponse = await linear.createCustomView({
name: "This Week's Tasks",
description: "List of tasks scheduled for this week",
filters: {
and: [
{ assignee: { id: { eq: "user-id" } } },
{ dueDate: { gte: new Date() } },
{ state: { type: { neq: "completed" } } }
]
},
teamId: "team-id"
});
Reporting Features
// Get Team Issue Statistics
const teamStats = await linear.team("team-id").issues({
filter: {
completedAt: {
gte: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000) // Last 30 days
}
}
});
// Get Active Issues
const activeIssues = await linear.issues({
filter: {
and: [
{ team: { key: { eq: "PROD" } } },
{ state: { type: { eq: "started" } } }
]
},
orderBy: [{ priority: "ASC" }, { updatedAt: "DESC" }]
});
// Get Cycle (Sprint) Progress
const cycle = await linear.cycle("cycle-id");
const cycleIssues = await cycle.issues();
const completedCount = cycleIssues.nodes.filter(issue =>
issue.state.type === "completed"
).length;
console.log(`Cycle progress: ${completedCount}/${cycleIssues.nodes.length}`);
Team Collaboration
// Slack Integration
const slackIntegrationResponse = await linear.createIntegration({
service: "slack",
organizationId: "org-id",
settings: {
webhookUrl: "https://hooks.slack.com/services/...",
channel: "#development",
events: ["issueCreate", "issueUpdate", "issueComplete"]
}
});
// GitHub Sync Configuration
const githubSyncResponse = await linear.createGithubIntegration({
repositoryUrl: "https://github.com/company/repo",
settings: {
autoCloseIssues: true,
branchNaming: "linear-{issueNumber}-{title-kebab}",
prTemplate: `
Closes Linear Issue: {issueUrl}
## Changes
{description}
## Testing
- [ ] Unit tests pass
- [ ] Integration tests pass
`
}
});
// Webhook Configuration
const webhookResponse = await linear.createWebhook({
url: "https://api.company.com/webhooks/linear",
resourceTypes: ["Issue", "Project", "Comment"],
enabled: true,
secret: "webhook-secret"
});