20 cards with no Set
Haskell, 62 bytes



tail[t|t@[a,b,c,d]&lt;-mapM(:[1,2])[0,0,0,0],mod(a*a+b*b+c*d)3&lt;1]


Try it online!

Defines a cap-set as all  \$(a,b,c,d)\$ from \$\{0,1,2\}^4\$ where $$a^2+b^2+cd=0\bmod3,$$ except not \$(0,0,0,0)\$.

I found this formula by looking at Wikipedia's example and coming up with progressively simpler formulas linking the allowed inner coordinates \$(a,b)\$ to the outer coordinates \$(c,d)\$.



Haskell, 46 bytes



[t|t&lt;-mapM(:"12")"0000",sum[1|'0'&lt;-t!!0:t]==2]


Try it online!

This uses a modified condition giving a different but equivalent cap set:

$$a^2+b^2+c^2 - d^2=0\bmod3,$$ still without \$(0,0,0,0)\$.

This is equivalent to \$a^2+b^2+c^2 + d^2 + d^2 =0\bmod3,\$, so we can duplicate an element and check that the give-element list of squares adds to zero modulo 3. Since squares modulo 3 are 0 or 1, this is further equivalent to this condition:


  There are exactly \$2\$ zeroes among \$[a,b,c,d,d]\$.


This automatically excludes the all-zero point. Of course, duplicating $d$ was arbitrary -- choosing another element gives a different but equivalent cap-set.