diff --git a/internal/artifact/artifact.go b/internal/artifact/artifact.go
index 3077ab711..1fd1d7984 100644
--- a/internal/artifact/artifact.go
+++ b/internal/artifact/artifact.go
@@ -1,7 +1,10 @@
 // Package artifact provides the core artifact storage for goreleaser
 package artifact
 
-import "sync"
+import (
+	"fmt"
+	"sync"
+)
 
 // Type defines the type of an artifact
 type Type int
@@ -104,12 +107,22 @@ func ByType(t Type) Filter {
 // Filter filters the artifact list, returning a new instance.
 // There are some pre-defined filters but anything of the Type Filter
 // is accepted.
-func (artifacts *Artifacts) Filter(filter Filter) Artifacts {
+func (artifacts *Artifacts) Filter(filters ...Filter) Artifacts {
 	var result = New()
 	for _, a := range artifacts.items {
-		if filter(a) {
+		if apply(a, filters) {
+			fmt.Println("add", a)
 			result.Add(a)
 		}
 	}
 	return result
 }
+
+func apply(a Artifact, filters []Filter) bool {
+	for _, filter := range filters {
+		if !filter(a) {
+			return false
+		}
+	}
+	return true
+}
diff --git a/internal/artifact/artifact_test.go b/internal/artifact/artifact_test.go
index 8ccc79138..6a1a35b34 100644
--- a/internal/artifact/artifact_test.go
+++ b/internal/artifact/artifact_test.go
@@ -13,7 +13,7 @@ func TestAdd(t *testing.T) {
 	for _, a := range []Artifact{
 		{
 			Name: "foo",
-			Type: Archive,
+			Type: UploadableArchive,
 		},
 		{
 			Name: "bar",
@@ -56,11 +56,16 @@ func TestFilter(t *testing.T) {
 			Name: "check",
 			Type: Checksum,
 		},
+		{
+			Name: "checkzumm",
+			Type: Checksum,
+		},
 	}
 	var artifacts = New()
 	for _, a := range data {
 		artifacts.Add(a)
 	}
+
 	assert.Len(t, artifacts.Filter(ByGoos("linux")).items, 1)
 	assert.Len(t, artifacts.Filter(ByGoos("darwin")).items, 0)
 
@@ -70,8 +75,12 @@ func TestFilter(t *testing.T) {
 	assert.Len(t, artifacts.Filter(ByGoarm("6")).items, 1)
 	assert.Len(t, artifacts.Filter(ByGoarm("7")).items, 0)
 
-	assert.Len(t, artifacts.Filter(ByType(Checksum)).items, 1)
+	assert.Len(t, artifacts.Filter(ByType(Checksum)).items, 2)
 	assert.Len(t, artifacts.Filter(ByType(Binary)).items, 0)
+
+	assert.Len(t, artifacts.Filter(ByType(Checksum), func(a Artifact) bool {
+		return a.Name == "checkzumm"
+	}).List(), 1)
 }
 
 func TestGroupByPlatform(t *testing.T) {
diff --git a/pipeline/brew/brew.go b/pipeline/brew/brew.go
index 8c1d82540..e9d3bb03c 100644
--- a/pipeline/brew/brew.go
+++ b/pipeline/brew/brew.go
@@ -10,18 +10,22 @@ import (
 	"strings"
 	"text/template"
 
+	"github.com/goreleaser/goreleaser/internal/artifact"
+
 	"github.com/apex/log"
+
 	"github.com/goreleaser/goreleaser/checksum"
 	"github.com/goreleaser/goreleaser/config"
 	"github.com/goreleaser/goreleaser/context"
-	"github.com/goreleaser/goreleaser/internal/archiveformat"
 	"github.com/goreleaser/goreleaser/internal/client"
 	"github.com/goreleaser/goreleaser/pipeline"
 )
 
-// ErrNoDarwin64Build when there is no build for darwin_amd64 (goos doesn't
-// contain darwin and/or goarch doesn't contain amd64)
-var ErrNoDarwin64Build = errors.New("brew tap requires a darwin amd64 build")
+// ErrNoDarwin64Build when there is no build for darwin_amd64
+var ErrNoDarwin64Build = errors.New("brew tap requires one darwin amd64 build")
+
+// ErrTooManyDarwin64Builds when there are too many builds for darwin_amd64
+var ErrTooManyDarwin64Builds = errors.New("brew tap requires at most one darwin amd64 build")
 
 const platform = "darwinamd64"
 
@@ -98,28 +102,31 @@ func doRun(ctx *context.Context, client client.Client) error {
 		return pipeline.Skip("archive format is binary")
 	}
 
-	var group = ctx.Binaries["darwinamd64"]
-	if group == nil {
+	var archives = ctx.Artifacts.Filter(
+		artifact.ByGoos("darwin"),
+		artifact.ByGoarch("amd64"),
+		artifact.ByGoarch(""),
+		artifact.ByType(artifact.UploadableArchive),
+	).List()
+	if len(archives) == 0 {
 		return ErrNoDarwin64Build
 	}
-	var folder string
-	for f := range group {
-		folder = f
-		break
+	if len(archives) > 0 {
+		return ErrTooManyDarwin64Builds
 	}
 	var path = filepath.Join(ctx.Config.Brew.Folder, ctx.Config.ProjectName+".rb")
 	log.WithField("formula", path).
 		WithField("repo", ctx.Config.Brew.GitHub.String()).
 		Info("pushing")
-	content, err := buildFormula(ctx, client, folder)
+	content, err := buildFormula(ctx, client, archives[0])
 	if err != nil {
 		return err
 	}
 	return client.CreateFile(ctx, content, path)
 }
 
-func buildFormula(ctx *context.Context, client client.Client, folder string) (bytes.Buffer, error) {
-	data, err := dataFor(ctx, client, folder)
+func buildFormula(ctx *context.Context, client client.Client, artifact artifact.Artifact) (bytes.Buffer, error) {
+	data, err := dataFor(ctx, client, artifact)
 	if err != nil {
 		return bytes.Buffer{}, err
 	}
@@ -135,9 +142,9 @@ func doBuildFormula(data templateData) (out bytes.Buffer, err error) {
 	return
 }
 
-func dataFor(ctx *context.Context, client client.Client, folder string) (result templateData, err error) {
-	var file = folder + "." + archiveformat.For(ctx, platform)
-	sum, err := checksum.SHA256(filepath.Join(ctx.Config.Dist, file))
+func dataFor(ctx *context.Context, client client.Client, artifact artifact.Artifact) (result templateData, err error) {
+	var file = artifact.Path
+	sum, err := checksum.SHA256(file)
 	if err != nil {
 		return
 	}