diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3a1ccb71356498dbdc1276e522bc5a431d684e09
--- /dev/null
+++ b/.github/workflows/lint.yml
@@ -0,0 +1,29 @@
+name: Linter
+
+on:
+  push:
+    branches:
+      - master
+  pull_request:
+    branches: '*'
+
+jobs:
+  lint:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v2
+      - name: Install node
+        uses: actions/setup-node@v1
+        with:
+          node-version: 16
+      - name: Cache
+        uses: actions/cache@v2
+        id: cache
+        with:
+          path: '**/node_modules'
+          key: yarn-v1-${{ hashFiles('**/yarn.lock') }}
+      - name: Install
+        run: yarn --immutable
+        if: steps.cache.outputs.cache-hit != 'true'
+      - name: Lint
+        run: yarn lint
diff --git a/packages/loot-core/.eslintignore b/packages/loot-core/.eslintignore
new file mode 100644
index 0000000000000000000000000000000000000000..bb4225346d4679cea9915c342f3d11db56fd8e4b
--- /dev/null
+++ b/packages/loot-core/.eslintignore
@@ -0,0 +1,3 @@
+**/node_modules/*
+**/lib-dist/*
+**/proto/*
diff --git a/packages/loot-core/package.json b/packages/loot-core/package.json
index 2529a5fe390eef490c2e5997c351ee68b9713adb..ab54b9dae319988f9ded8d12608ab6303b7dad69 100644
--- a/packages/loot-core/package.json
+++ b/packages/loot-core/package.json
@@ -9,7 +9,7 @@
     "build:api": "cross-env NODE_ENV=development webpack --config ./webpack/webpack.api.config.js",
     "build:browser": "NODE_ENV=production ./bin/build-browser",
     "watch:browser": "NODE_ENV=development ./bin/build-browser",
-    "lint": "eslint --ignore-pattern '**/node_modules/*' --ignore-pattern '**/lib-dist/*' --ignore-pattern '**/proto/*' src"
+    "lint": "eslint src"
   },
   "author": "",
   "license": "ISC",