diff --git a/data/Linter/infer.yaml b/data/Linter/infer.yaml
new file mode 100644
index 0000000..afc4dc4
--- /dev/null
+++ b/data/Linter/infer.yaml
@@ -0,0 +1,12 @@
+name: Infer
+executable: infer
+website: https://fbinfer.com/
+packages:
+ - infer-0.7.0-linux
+languages:
+ - C
+ - CPlusPlus
+ - Java
+ - Objective-C
+aspects:
+ - Security
diff --git a/data/Linter/pyflakes.yaml b/data/Linter/pyflakes.yaml
new file mode 100644
index 0000000..a761b42
--- /dev/null
+++ b/data/Linter/pyflakes.yaml
@@ -0,0 +1,10 @@
+name: pyflakes
+executable: pyflakes
+packages:
+ - pyflakes
+languages:
+ - Python
+aspects:
+ - Syntax
+ - Unused Code
+ - Undefined Element
diff --git a/data/Package/infer-0.7.0-linux.yaml b/data/Package/infer-0.7.0-linux.yaml
new file mode 100644
index 0000000..0695226
--- /dev/null
+++ b/data/Package/infer-0.7.0-linux.yaml
@@ -0,0 +1,6 @@
+name: infer
+manager: opam
+source: https://github.com/facebook/infer/releases/download/
+ v0.7.0/infer-linux64-v0.7.0.tar.xz
+version: 0.7.0
+platform: linux
diff --git a/data/Package/pyflakes.yaml b/data/Package/pyflakes.yaml
new file mode 100644
index 0000000..e259be2
--- /dev/null
+++ b/data/Package/pyflakes.yaml
@@ -0,0 +1,3 @@
+name: pyflakes
+manager: pip
+version: 2.0.0
diff --git a/data/PackageManager/_all.yml b/data/PackageManager/_all.yml
new file mode 100644
index 0000000..af81a27
--- /dev/null
+++ b/data/PackageManager/_all.yml
@@ -0,0 +1,3 @@
+- pk: npm
+- pk: opam
+- pk: pip
diff --git a/models/Aspect.yaml b/models/Aspect.yaml
new file mode 100644
index 0000000..8845d6f
--- /dev/null
+++ b/models/Aspect.yaml
@@ -0,0 +1 @@
+# pk: String
diff --git a/models/Linter.yaml b/models/Linter.yaml
new file mode 100644
index 0000000..6a9ac7f
--- /dev/null
+++ b/models/Linter.yaml
@@ -0,0 +1,8 @@
+name: String
+executable: String
+repology_id: String # optional
+wikidata: String # optional
+website: String
+languages: Language[]
+aspects: Aspect[] # i.e. CAN_DETECT & CAN_FIX
+packages: Package[] # only needed where Repology does not provide
diff --git a/models/Package.yaml b/models/Package.yaml
new file mode 100644
index 0000000..4bff567
--- /dev/null
+++ b/models/Package.yaml
@@ -0,0 +1,7 @@
+name: String
+manager: PackageManager
+version: String
+repology_id: String # optional
+wikidata: String # optional
+source: String # optional
+platform: Platform # optional
diff --git a/models/PackageManager.yaml b/models/PackageManager.yaml
new file mode 100644
index 0000000..8845d6f
--- /dev/null
+++ b/models/PackageManager.yaml
@@ -0,0 +1 @@
+# pk: String
diff --git a/models/Platform.yaml b/models/Platform.yaml
new file mode 100644
index 0000000..8845d6f
--- /dev/null
+++ b/models/Platform.yaml
@@ -0,0 +1 @@
+# pk: String
diff --git a/templates/Linter.html.jinja2 b/templates/Linter.html.jinja2
new file mode 100644
index 0000000..dfcc20a
--- /dev/null
+++ b/templates/Linter.html.jinja2
@@ -0,0 +1,37 @@
+
+
+
+ {{ site_title }}: {{ linter.name }}
+
+
+
+
+
+
+
+ executable |
+ {{ linter.executable }} |
+
+
+ Repology |
+ {{ linter.repology_id }} |
+
+
+ Wikidata |
+ {{ linter.wikidata }} |
+
+
+ Packages |
+
+
+ {% for package in linter.packages %}
+ - {{ package.manager.name }} {{ package.name }}
+ {% endfor %}{# for package in linter.packages #}
+
+ |
+
+
+
+
diff --git a/templates/Package.html.jinja2 b/templates/Package.html.jinja2
new file mode 100644
index 0000000..80f6078
--- /dev/null
+++ b/templates/Package.html.jinja2
@@ -0,0 +1,31 @@
+
+
+
+ {{ site_title }}: {{ package.name }}
+
+
+
+
+
+
+
+ Package manager |
+ {{ package.manager.name }} |
+
+
+ Version |
+ {{ package.version }} |
+
+
+ Source |
+ {{ package.source }} |
+
+
+ Platform |
+ {{ package.platform }} |
+
+
+
+
diff --git a/templates/home.html.jinja2 b/templates/home.html.jinja2
index f87d6a3..b0c7995 100644
--- a/templates/home.html.jinja2
+++ b/templates/home.html.jinja2
@@ -10,10 +10,24 @@
+
+
+
+
+
+
+ {% for linter in linters %}
+ - {{ linter.name }}
+ {% endfor %}{# for linter in linters #}
+