A TRMNL plugin that displays Linear issues assigned to you that are due in the current cycle or earlier.
- π Shows issues from current cycle and earlier cycles
- π΄ Priority-based color coding (Urgent/High priority badges)
- π·οΈ Displays status and cycle information
- π Shows cycle numbers with status indicators (current/past/future)
- β»οΈ Auto-refreshes every 15 minutes
- β¨ Clean, modern UI optimized for e-ink displays
- π Responsive layouts for full-screen, half-screen, and quadrant views
- βοΈ Configurable maximum number of issues to display
If someone has already deployed this plugin, you just need your Linear API key:
-
Get Your Linear API Key
- Go to Linear Settings > API
- Create a new Personal API Key
- Copy the key
-
Add Plugin to TRMNL
- Go to TRMNL Plugins or use the Linear Issues Recipe
- Find "Linear Issues - Current Cycle" (or use the shared plugin URL)
- Click "Add to my TRMNL"
- Enter your Linear API key in the plugin settings form field
- Optionally configure the maximum number of issues to display (default: 15)
- Save and activate!
If you want to host your own instance:
- Go to Linear Settings > API
- Create a new Personal API Key
- Copy the key (users will configure it in TRMNL, not in Vercel)
# Install dependencies
npm install
# Login to Vercel (if not already logged in)
npx vercel login
# Deploy to Vercel
npx vercel --prodAfter deployment, Vercel will give you a URL like:
https://your-project.vercel.app/api/linear-issues
This is your polling URL for TRMNL.
- Go to TRMNL Plugins
- Click "Create Private Plugin" (or "Create Public Plugin" to share)
- Fill in the details:
- Name: Linear Issues - Current Cycle
- Strategy: Polling
- Polling URL: Your Vercel URL from step 3
- Refresh Interval: 15 minutes (or your preference)
- Upload the
linear.liquidfile as the markup template - Upload the
form-fields.yamlfile to configure the plugin form fields - Save the plugin
- When users add your plugin, they'll be prompted to enter their Linear API key and optionally configure the maximum number of issues
The API endpoint returns data in this format:
{
"issues": [
{
"id": "issue-id",
"identifier": "SIS-810",
"title": "Issue title",
"priority": 1,
"priorityLabel": "Urgent",
"status": "In Progress",
"url": "https://linear.app/...",
"cycleNumber": 4,
"cycleStatus": "current",
"dueDate": "2025-11-20",
"labels": ["Bug", "Feature"]
}
],
"total_count": 5,
"current_cycle": 4,
"updated_at": "2025-11-17T10:00:00Z",
"user_name": "Your Name"
}0: No priority1: Urgent (displayed with black badge)2: High (displayed with gray badge)3: Normal4: Low
current: Issue is in the current active cyclepast: Issue is in a cycle that has endedfuture: Issue is in a future cycle
Edit api/linear-issues.ts to change which issues are included:
- Currently includes: Issues assigned to you that have a cycle (current, past, or future)
- Excludes: Completed and cancelled issues, backlog items without cycles
- Issues are sorted by cycle number (earlier cycles first), then by priority (urgent first)
The plugin supports a configurable maximum number of issues via the max_issues form field (default: 15). Users can set this between 5-30 issues in the plugin settings.
The linear.liquid template uses this value:
- Full-screen view: Shows up to
max_issues(default 15) - Compact views (half-screen/quadrant): Shows fewer items based on view size
To change the default, edit form-fields.yaml:
- keyname: max_issues
default: 15 # Change this valueEdit the CSS in linear.liquid:
.priority-1 {
background: #000; /* Urgent - Black */
box-shadow: 0 0 0 2px rgba(0,0,0,0.2);
}
.priority-2 {
background: #666; /* High - Dark Gray */
box-shadow: 0 0 0 2px rgba(0,0,0,0.1);
}
.priority-3 { background: #999; } /* Normal - Medium Gray */
.priority-4 { background: #ccc; } /* Low - Light Gray */The template automatically limits items based on view size:
- Quadrant view: Shows up to 2 issues
- Half-screen views: Shows up to 5 issues
- Full-screen view: Shows up to
max_issues(default 15)
# Install dependencies
npm install
# Run locally with Vercel CLI
npx vercel dev
# Test the endpoint (replace YOUR_LINEAR_API_KEY with your actual key)
curl -H "X-Linear-API-Key: YOUR_LINEAR_API_KEY" http://localhost:3000/api/linear-issues- Check that you have issues assigned to you in Linear
- Verify issues have a cycle assigned (backlog items without cycles are excluded)
- Make sure issues aren't marked as completed/cancelled
- Ensure issues are assigned to you (not just watching them)
-
Verify your Linear API key is correct (test it in Linear's API console)
-
Make sure your Linear API key is entered correctly in the TRMNL plugin form fields
-
Check the Vercel function logs for detailed error messages
-
Test the API endpoint directly:
# Using query parameter curl "https://your-project.vercel.app/api/linear-issues?linear_api_key=YOUR_KEY" # Using header curl -H "X-Linear-API-Key: YOUR_KEY" https://your-project.vercel.app/api/linear-issues
- Make sure the TRMNL plugin is activated
- Check that the polling URL is correct
- Verify the refresh interval settings
MIT
trml plugins/
βββ api/
β βββ linear-issues.ts # Vercel serverless function (API endpoint)
βββ linear.liquid # TRMNL markup template
βββ form-fields.yaml # Plugin form field definitions
βββ package.json # Node.js dependencies
βββ vercel.json # Vercel configuration
βββ README.md # This file
The API endpoint accepts Linear API keys via multiple methods (in order of precedence):
- Query parameter:
?linear_api_key=YOUR_KEY - Header:
X-Linear-API-Key: YOUR_KEY - Authorization header:
Authorization: Bearer YOUR_KEY - Environment variable:
LINEAR_API_KEY(for development only)
For issues or questions:
- Linear Issues Recipe on TRMNL - Direct link to add the plugin
- Check the TRMNL Documentation
- Review Linear API Docs
- Plugin repository: GitHub