diff --git a/exercises/practice/bank-account/.approaches/config.json b/exercises/practice/bank-account/.approaches/config.json
index 54016ab92d..beedcc257c 100644
--- a/exercises/practice/bank-account/.approaches/config.json
+++ b/exercises/practice/bank-account/.approaches/config.json
@@ -12,7 +12,10 @@
       "blurb": "Use a lock statement to prevent concurrent balance updates.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:lock"]
+      }
     },
     {
       "uuid": "b6d6ab21-82bb-4285-a840-5bc209ec9524",
@@ -21,7 +24,10 @@
       "blurb": "Use a Mutex to prevent concurrent balance updates.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["uses:Mutex"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/bob/.approaches/config.json b/exercises/practice/bob/.approaches/config.json
index 6f69f34867..065221291a 100644
--- a/exercises/practice/bob/.approaches/config.json
+++ b/exercises/practice/bob/.approaches/config.json
@@ -15,7 +15,18 @@
       "blurb": "Use if statements to return the answer.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:if"],
+        "not": [
+          "technique:regular-expression", 
+          "construct:switch", 
+          "construct:switch-expression",
+          "construct:array",
+          "construct:list",
+          "construct:dictionary"
+        ]
+      }
     },
     {
       "uuid": "567f04d3-368e-4874-9fde-07ce1f7b199f",
@@ -24,7 +35,11 @@
       "blurb": "Use switch on a tuple to return the answer.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:tuple"],
+        "any": ["construct:switch", "construct:switch-expression"]
+      }
     },
     {
       "uuid": "8b31fcf5-229e-474a-aaf5-b00dc5d977c5",
@@ -33,7 +48,11 @@
       "blurb": "Index into an array to return the answer.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:array"],
+        "not": ["technique:regular-expression", "construct:tuple"]
+      }
     },
     {
       "uuid": "4fb2cc1b-197f-458f-80fb-cdc6746ff0d6",
@@ -42,7 +61,10 @@
       "blurb": "Use regular expressions to return the answer.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["technique:regular-expression"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/collatz-conjecture/.approaches/config.json b/exercises/practice/collatz-conjecture/.approaches/config.json
index 97b0b5a973..7982c4b4fc 100644
--- a/exercises/practice/collatz-conjecture/.approaches/config.json
+++ b/exercises/practice/collatz-conjecture/.approaches/config.json
@@ -12,7 +12,10 @@
       "blurb": "Use a while loop to find the number of steps.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:while-loop"]
+      }
     },
     {
       "uuid": "8c7199ed-d74d-4e3d-b9d0-5f8595597528",
@@ -21,7 +24,10 @@
       "blurb": "Use recursion to find the number of steps.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["technique:recursion"]
+      }
     },
     {
       "uuid": "4f91abfb-4c83-4e6d-84bc-bd08211d34d6",
@@ -30,7 +36,10 @@
       "blurb": "Use a (lazy) sequence and count its elements to find the number of steps.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["uses:Enumerable.Count", "uses:yield"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/darts/.approaches/config.json b/exercises/practice/darts/.approaches/config.json
index 2318ec4a6e..20be28193c 100644
--- a/exercises/practice/darts/.approaches/config.json
+++ b/exercises/practice/darts/.approaches/config.json
@@ -12,7 +12,10 @@
       "blurb": "Use if statements.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:if"]
+      }
     },
     {
       "uuid": "5f0878ae-8faf-4db9-b3d5-775e2d9bff37",
@@ -21,7 +24,10 @@
       "blurb": "Use a switch expression.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "any": ["construct:switch", "construct:switch-expression"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/difference-of-squares/.approaches/config.json b/exercises/practice/difference-of-squares/.approaches/config.json
index 94475754c2..01b59c1536 100644
--- a/exercises/practice/difference-of-squares/.approaches/config.json
+++ b/exercises/practice/difference-of-squares/.approaches/config.json
@@ -12,7 +12,10 @@
       "blurb": "Use LINQ to calculate the sums.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["uses:linq"]
+      }
     },
     {
       "uuid": "a6118dd7-26d5-4576-919f-11a584beeef8",
@@ -21,7 +24,10 @@
       "blurb": "Use a for statement to calculate the sums.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:for-loop"]
+      }
     },
     {
       "uuid": "bdcb02d2-1a34-4a52-a80c-ca94907ba721",
@@ -30,7 +36,10 @@
       "blurb": "Use math to calculate the sums.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["technique:math"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/diffie-hellman/.approaches/config.json b/exercises/practice/diffie-hellman/.approaches/config.json
index 192f783b23..3b8b828c9b 100644
--- a/exercises/practice/diffie-hellman/.approaches/config.json
+++ b/exercises/practice/diffie-hellman/.approaches/config.json
@@ -12,7 +12,10 @@
       "blurb": "Use the BigInteger class to easily implement diffie-hellman.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:big-integer"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/gigasecond/.approaches/config.json b/exercises/practice/gigasecond/.approaches/config.json
index ee593c80fe..61b7c4c4cf 100644
--- a/exercises/practice/gigasecond/.approaches/config.json
+++ b/exercises/practice/gigasecond/.approaches/config.json
@@ -12,7 +12,10 @@
       "blurb": "Add a gigasecond via AddSeconds().",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["uses:DateTime.AddSeconds"]
+      }
     },
     {
       "uuid": "f241c90d-6cba-49ad-9e8e-59cac73ca6e5",
@@ -21,7 +24,10 @@
       "blurb": "Add a gigasecond via a TimeSpan.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["uses:DateTime.Plus(TimeSpan)"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/grade-school/.approaches/config.json b/exercises/practice/grade-school/.approaches/config.json
index f3694cebef..305561b9ee 100644
--- a/exercises/practice/grade-school/.approaches/config.json
+++ b/exercises/practice/grade-school/.approaches/config.json
@@ -12,7 +12,10 @@
       "blurb": "Use specialized sorted collections for automatic sorting.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["technique:sorted-collection"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/grains/.approaches/config.json b/exercises/practice/grains/.approaches/config.json
index 75810f4f08..23c6706ee2 100644
--- a/exercises/practice/grains/.approaches/config.json
+++ b/exercises/practice/grains/.approaches/config.json
@@ -12,7 +12,10 @@
       "blurb": "Use Math.Pow to raise 2 by a specified power.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": ["uses:Math.Pow"]
+      }
     },
     {
       "uuid": "71f823dc-c667-46ee-875f-6e73918d0336",
@@ -21,7 +24,10 @@
       "blurb": "Use bit-shifting to raise 2 by a specified power.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": ["technique:bit-shifting"]
+      }
     },
     {
       "uuid": "076f430a-3779-4249-a190-b75110da455b",
@@ -30,7 +36,10 @@
       "blurb": "Use UInt64.MaxValue for Total.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": ["uses:ulong.MaxValue"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/hamming/.approaches/config.json b/exercises/practice/hamming/.approaches/config.json
index 5d66641b75..a1569ddeaa 100644
--- a/exercises/practice/hamming/.approaches/config.json
+++ b/exercises/practice/hamming/.approaches/config.json
@@ -12,7 +12,10 @@
       "blurb": "Calculate the hamming distance via LINQ.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["uses:linq"]
+      }
     },
     {
       "uuid": "d210b47c-b61d-4a73-be55-23c68ce1b600",
@@ -21,7 +24,10 @@
       "blurb": "Calculate the hamming distance using a for-loop.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:for-loop"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/isogram/.approaches/config.json b/exercises/practice/isogram/.approaches/config.json
index 1c43660e96..66ab1f0771 100644
--- a/exercises/practice/isogram/.approaches/config.json
+++ b/exercises/practice/isogram/.approaches/config.json
@@ -12,7 +12,10 @@
       "blurb": "Use Distinct with Count to return the answer.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": ["uses:Enumerable.Distinct"]
+      }
     },
     {
       "uuid": "78bc9485-94b7-4bac-8ce6-d577e85670a1",
@@ -21,7 +24,10 @@
       "blurb": "Use GroupBy with All and Count to return the answer.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": ["uses:Enumerable.GroupBy"]
+      }
     },
     {
       "uuid": "5a77a3ff-8474-4238-bf23-c7c657f27e34",
@@ -30,7 +36,10 @@
       "blurb": "Use a bit field to keep track of used letters.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": ["technique:bit-shifting"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/leap/.approaches/config.json b/exercises/practice/leap/.approaches/config.json
index 7a1684e7b9..100408e237 100644
--- a/exercises/practice/leap/.approaches/config.json
+++ b/exercises/practice/leap/.approaches/config.json
@@ -15,7 +15,10 @@
       "blurb": "Use a chain of boolean expressions.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": ["technique:boolean-logic"]
+      }
     },
     {
       "uuid": "eebe5a57-7e58-44c2-92e6-50f46f1251ac",
@@ -24,7 +27,11 @@
       "blurb": "Use a ternary operator of boolean expressions.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:ternary"],
+        "not": ["construct:logical-and", "construct:logical-or"]
+      }
     },
     {
       "uuid": "cb7c88a6-49f3-4744-a3e8-fcc7acc0770d",
@@ -33,7 +40,11 @@
       "blurb": "Use a switch on a tuple made from boolean expressions.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:tuple"],
+        "any": ["construct:switch-expression", "construct:switch"]
+      }
     },
     {
       "uuid": "1691a675-03a5-47da-a878-f76cfb895dc6",
@@ -42,7 +53,10 @@
       "blurb": "Use DateTime addition.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": ["uses:DateTime.AddDays"]
+      }
     },
     {
       "uuid": "28483396-da67-4f59-8388-4c63065dab00",
@@ -51,7 +65,10 @@
       "blurb": "Use the built-in method.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": ["uses:DateTime.IsLeapYear"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/pangram/.approaches/config.json b/exercises/practice/pangram/.approaches/config.json
index 382bdcd6bc..21cf9265e9 100644
--- a/exercises/practice/pangram/.approaches/config.json
+++ b/exercises/practice/pangram/.approaches/config.json
@@ -12,7 +12,14 @@
       "blurb": "Use All with Contains on lowercased letters.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": [
+          "uses:Enumerable.All",
+          "uses:String.Contains(char)",
+          "uses:String.ToLower"
+        ]
+      }
     },
     {
       "uuid": "8886e091-72bf-40c7-9e86-fdde96bbbae2",
@@ -21,7 +28,13 @@
       "blurb": "Use All with Contains using case insensitive.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": [
+          "uses:Enumerable.All",
+          "uses:string.Contains(char, System.StringComparison)"
+        ]
+      }
     },
     {
       "uuid": "7eeae24f-d815-400c-9749-b617864e185f",
@@ -30,7 +43,10 @@
       "blurb": "Use a bit field to keep track of used letters.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": ["technique:bit-shifting"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/parallel-letter-frequency/.approaches/config.json b/exercises/practice/parallel-letter-frequency/.approaches/config.json
index c36c194941..b2ef547535 100644
--- a/exercises/practice/parallel-letter-frequency/.approaches/config.json
+++ b/exercises/practice/parallel-letter-frequency/.approaches/config.json
@@ -12,7 +12,10 @@
       "blurb": "Use AsParallel() to parallelize counting characters.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["uses:Enumerable.AsParallel"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/perfect-numbers/.approaches/config.json b/exercises/practice/perfect-numbers/.approaches/config.json
index 9708538e3d..9f326cc669 100644
--- a/exercises/practice/perfect-numbers/.approaches/config.json
+++ b/exercises/practice/perfect-numbers/.approaches/config.json
@@ -14,7 +14,10 @@
       "authors": [
         "erikschierboom",
         "aage"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:if"]
+      }
     },
     {
       "uuid": "fb72e324-eed2-46bb-a6a9-cb3bb68514bf",
@@ -23,7 +26,10 @@
       "blurb": "Use switch expression to check for a perfect number.",
       "authors": [
         "aage"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:switch-expression"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/phone-number/.approaches/config.json b/exercises/practice/phone-number/.approaches/config.json
index 7613655daf..eb3636992f 100644
--- a/exercises/practice/phone-number/.approaches/config.json
+++ b/exercises/practice/phone-number/.approaches/config.json
@@ -12,7 +12,10 @@
       "blurb": "Use a regular expression to check and parse the phone number.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["technique:regular-expression"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/pig-latin/.approaches/config.json b/exercises/practice/pig-latin/.approaches/config.json
index 8b011f0dda..d4a57fae1a 100644
--- a/exercises/practice/pig-latin/.approaches/config.json
+++ b/exercises/practice/pig-latin/.approaches/config.json
@@ -12,7 +12,10 @@
       "blurb": "Use regular expressions to match and rewrite a sentence.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["technique:regular-expression"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/protein-translation/.approaches/config.json b/exercises/practice/protein-translation/.approaches/config.json
index 7e5d2c84eb..5b0a169e75 100644
--- a/exercises/practice/protein-translation/.approaches/config.json
+++ b/exercises/practice/protein-translation/.approaches/config.json
@@ -12,7 +12,10 @@
       "blurb": "Iterate Substrings with Dictionary.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:dictionary", "uses:String.Substring"]
+      }
     },
     {
       "uuid": "8f8a9272-74d7-47f7-8d66-e4b280c67de5",
@@ -21,7 +24,10 @@
       "blurb": "Iterate Substrings with switch.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:switch", "uses:String.Substring"]
+      }
     },
     {
       "uuid": "2a050672-c9ac-40e7-a836-9a844f8811e8",
@@ -30,7 +36,13 @@
       "blurb": "Use LINQ with Dictionary.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": [
+          "uses:linq",
+          "construct:dictionary"
+        ]
+      }
     },
     {
       "uuid": "07202257-f3b8-4008-b661-91234f26a6ff",
@@ -39,7 +51,14 @@
       "blurb": "Iterate using yield with Dictionary.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": [
+          "uses:yield", 
+          "construct:dictionary",
+          "construct:switch-expression"
+        ]
+      }
     },
     {
       "uuid": "621d443b-74a7-48d9-8339-7f1fcec53a15",
@@ -48,7 +67,13 @@
       "blurb": "Iterate using yield with switch.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": [
+          "uses:yield", 
+          "construct:switch-expression"
+        ]
+      }
     }
   ]
 }
diff --git a/exercises/practice/proverb/.approaches/config.json b/exercises/practice/proverb/.approaches/config.json
index 2f90249e1e..068fb68b22 100644
--- a/exercises/practice/proverb/.approaches/config.json
+++ b/exercises/practice/proverb/.approaches/config.json
@@ -12,7 +12,10 @@
       "blurb": "Use LINQ to to iterate over the subjects and recite the song.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["uses:linq"]
+      }
     },
     {
       "uuid": "17a95b9d-af7a-4e8d-9086-aa4522c21dd9",
@@ -21,7 +24,10 @@
       "blurb": "Use a for loop to to iterate over the subjects and recite the song.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:for-loop"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/raindrops/.approaches/config.json b/exercises/practice/raindrops/.approaches/config.json
index 0308467e50..6017362a20 100644
--- a/exercises/practice/raindrops/.approaches/config.json
+++ b/exercises/practice/raindrops/.approaches/config.json
@@ -12,7 +12,11 @@
       "blurb": "Use a chain of if statements.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:if"],
+        "not": ["uses:linq"]
+      }
     },
     {
       "uuid": "dc8fca24-1a44-4bb6-a08b-50d47de757c4",
@@ -21,7 +25,10 @@
       "blurb": "Use the LINQ Aggregate method.",
       "authors": [
         "bobahop"
-      ]
+      ],
+      "tags": {
+        "all": ["uses:Enumerable.Aggregate"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/reverse-string/.approaches/config.json b/exercises/practice/reverse-string/.approaches/config.json
index c72e12960b..7f5ad25f70 100644
--- a/exercises/practice/reverse-string/.approaches/config.json
+++ b/exercises/practice/reverse-string/.approaches/config.json
@@ -12,7 +12,10 @@
       "blurb": "Use Array.Reverse to reverse a string.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["uses:Array.Reverse"]
+      }
     },
     {
       "uuid": "581af3cf-5218-41cc-84ff-50fbb2d9601a",
@@ -21,7 +24,10 @@
       "blurb": "Use LINQ to concisely reverse a string.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["uses:linq"]
+      }
     },
     {
       "uuid": "448fb2b4-18ab-4e55-aa54-ad4ed6d5f7f6",
@@ -30,7 +36,10 @@
       "blurb": "Use Span<T> and stack allocation for hyper-optimized string reversal.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["uses:Span<T>"]
+      }
     },
     {
       "uuid": "053bd627-c362-4f2e-8e2f-01bd279b0ef6",
@@ -39,7 +48,10 @@
       "blurb": "Reverse a string using the StringBuilder class.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["uses:StringBuilder"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/rna-transcription/.approaches/config.json b/exercises/practice/rna-transcription/.approaches/config.json
index 1ee1fe1733..16f34d8608 100644
--- a/exercises/practice/rna-transcription/.approaches/config.json
+++ b/exercises/practice/rna-transcription/.approaches/config.json
@@ -12,7 +12,10 @@
       "blurb": "Use a Dictionary and some LINQ to translate the DNA strand.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:dictionary"]
+      }
     },
     {
       "uuid": "576af402-9b7f-46fd-8642-bf8fa6d0d4fa",
@@ -21,7 +24,10 @@
       "blurb": "Use a switch expression and some LINQ to translate the DNA strand.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:switch-expression"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/series/.approaches/config.json b/exercises/practice/series/.approaches/config.json
index db46f71af6..6adacd9dea 100644
--- a/exercises/practice/series/.approaches/config.json
+++ b/exercises/practice/series/.approaches/config.json
@@ -12,7 +12,10 @@
       "blurb": "Use a for loop to iterate over the slices.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:for-loop"]
+      }
     },
     {
       "uuid": "3857e426-8dac-41f2-bea0-4c8a0b8cd7bc",
@@ -21,7 +24,10 @@
       "blurb": "Use LINQ to iterate over the slices.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["uses:linq"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/sieve/.approaches/config.json b/exercises/practice/sieve/.approaches/config.json
index a085884d4f..88ac209dc8 100644
--- a/exercises/practice/sieve/.approaches/config.json
+++ b/exercises/practice/sieve/.approaches/config.json
@@ -12,7 +12,10 @@
       "blurb": "Use a BitArray to sieve out primes.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:bit-array"]
+      }
     },
     {
       "uuid": "4d367233-9bd4-45f9-9b33-b08cb78e15fa",
@@ -21,7 +24,10 @@
       "blurb": "Use a HashSet to sieve out primes.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:set"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/two-fer/.approaches/config.json b/exercises/practice/two-fer/.approaches/config.json
index 9d7256097e..b1939a4268 100644
--- a/exercises/practice/two-fer/.approaches/config.json
+++ b/exercises/practice/two-fer/.approaches/config.json
@@ -12,7 +12,10 @@
       "blurb": "Use an optional parameter and its default value.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:optional-parameter"]
+      }
     },
     {
       "uuid": "e3999368-f13c-42e9-a814-e385356fd640",
@@ -21,7 +24,10 @@
       "blurb": "Use method overloading.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["construct:method-overloading"]
+      }
     }
   ]
 }
diff --git a/exercises/practice/yacht/.approaches/config.json b/exercises/practice/yacht/.approaches/config.json
index 36c2f66c3d..b7dd3b647f 100644
--- a/exercises/practice/yacht/.approaches/config.json
+++ b/exercises/practice/yacht/.approaches/config.json
@@ -12,7 +12,10 @@
       "blurb": "Use LINQ to score yacht hands.",
       "authors": [
         "erikschierboom"
-      ]
+      ],
+      "tags": {
+        "all": ["uses:linq"]
+      }
     }
   ]
 }