Skip to content

Linear provider

The Linear provider mounts your Linear workspace under /linear. Teams appear as directories; issues are subdirectories containing one file per field. Any tool that reads files, grep, awk, jq, shell scripts, can query your backlog without the Linear API or SDK.

The provider requires a Linear personal access token. Create one at Settings → API → Personal API keys in the Linear app, then expose it as an environment variable before mounting:

Terminal window
export LINEAR_TOKEN=lin_api_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
omnifs mount /omnifs

The token needs at least read access to the teams and issues you want to browse. omnifs holds the credential in the host runtime; the provider WASM component never opens a socket itself.

/linear/
└── teams/
└── {KEY}/
└── issues/
├── _open/ ← open issues only
├── _all/ ← every issue regardless of state
└── {filter}/
└── {KEY-N}/
├── title
├── state
├── priority
├── assignee
└── description.md

{KEY} is the Linear team identifier (e.g. ENG, SEC, INFRA). {filter} is either _open or _all. {KEY-N} is the full issue identifier including the team prefix (e.g. ENG-1421).

List all open issues for a team:

Terminal window
ls /omnifs/linear/teams/ENG/issues/_open
ENG-1387 ENG-1412 ENG-1421 ENG-1438

Read the state of a specific issue:

Terminal window
cat /omnifs/linear/teams/ENG/issues/_open/ENG-1421/state
In Progress

Read the full description:

Terminal window
cat /omnifs/linear/teams/ENG/issues/_open/ENG-1421/description.md

Check priority and assignee together:

Terminal window
cat /omnifs/linear/teams/ENG/issues/_open/ENG-1421/priority
cat /omnifs/linear/teams/ENG/issues/_open/ENG-1421/assignee

Priority values are the strings Linear uses: No priority, Urgent, High, Medium, Low.

Because fields are files, standard Unix tools compose naturally.

Find all issues assigned to a specific person:

Terminal window
grep -rl "alice" /omnifs/linear/teams/ENG/issues/_open/*/assignee

List every high-priority open issue across two teams:

Terminal window
for team in ENG SEC; do
for issue in /omnifs/linear/teams/$team/issues/_open/*/; do
pri=$(cat "$issue/priority")
if [ "$pri" = "High" ] || [ "$pri" = "Urgent" ]; then
echo "$pri $(basename $issue) $(cat $issue/title)"
fi
done
done

Search issue descriptions for a keyword:

Terminal window
grep -rl "rate limit" /omnifs/linear/teams/ENG/issues/_all/*/description.md

Count open issues per state:

Terminal window
for issue in /omnifs/linear/teams/ENG/issues/_open/*/; do
cat "$issue/state"
done | sort | uniq -c | sort -rn

omnifs assigns stable inodes based on Linear’s issue IDs. An issue that moves from _open to _all (because it is closed) keeps the same inode. Scripts that track by inode stay correct across state transitions.

The host cache is invalidated by upstream events from Linear’s webhook stream, not by TTLs. A freshly closed issue will disappear from _open when the event arrives rather than after an arbitrary interval. If you read a file immediately after an action in the Linear app, there may be a short propagation delay before the cache reflects it.

Every read resolves through three operations in the omnifs:provider@1.0.0 WIT interface: lookup-child, list-children, read-file. There are no additional calls; the provider does not batch or prefetch.