diff --git a/tools/apps/update_homebrew/.gitignore b/tools/apps/update_homebrew/.gitignore
deleted file mode 100644
index e4da250a3..0000000
--- a/tools/apps/update_homebrew/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-.packages
-.dart_tool
diff --git a/tools/apps/update_homebrew/bin/generate.dart b/tools/apps/update_homebrew/bin/generate.dart
deleted file mode 100644
index ea29e06..0000000
--- a/tools/apps/update_homebrew/bin/generate.dart
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:io';
-
-import 'package:args/args.dart';
-import 'package:path/path.dart' as p;
-import 'package:stack_trace/stack_trace.dart';
-import 'package:update_homebrew/update_homebrew.dart';
-
-void main(List<String> args) async {
-  final parser = ArgParser()
-    ..addOption('revision', abbr: 'r')
-    ..addOption('channel', abbr: 'c', allowed: supportedChannels);
-
-  final options = parser.parse(args);
-  final revision = options['revision'] as String;
-  final channel = options['channel'] as String;
-  if ([revision, channel].contains(null)) {
-    print(
-        "Usage: generate.dart -r revision -c channel <path_to_existing_dart.rb>");
-    exitCode = 1;
-    return;
-  }
-
-  if (options.rest.length != 1) {
-    print("Pass in the path to an existing '$dartRbFileName' file.");
-    exitCode = 1;
-    return;
-  }
-  final existingDartRb = options.rest.single;
-
-  var file = File(existingDartRb);
-
-  if (!file.existsSync()) {
-    print("Expected '$existingDartRb' to exist.");
-    exitCode = 1;
-    return;
-  }
-
-  if (p.basename(existingDartRb) != dartRbFileName) {
-    print("Expected provided path to end with '$dartRbFileName'.");
-    exitCode = 1;
-  }
-
-  await Chain.capture(() async {
-    await writeHomebrewInfo(channel, revision, file.parent.path);
-  }, onError: (error, chain) {
-    print(error);
-    print(chain.terse);
-    exitCode = 1;
-  });
-}
diff --git a/tools/apps/update_homebrew/bin/ssh_with_key b/tools/apps/update_homebrew/bin/ssh_with_key
deleted file mode 100755
index 6df4a04..0000000
--- a/tools/apps/update_homebrew/bin/ssh_with_key
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/usr/bin/env bash
-ssh -i $SSH_KEY_PATH $@
diff --git a/tools/apps/update_homebrew/bin/update_homebrew.dart b/tools/apps/update_homebrew/bin/update_homebrew.dart
deleted file mode 100644
index 68dc9e0..0000000
--- a/tools/apps/update_homebrew/bin/update_homebrew.dart
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:io';
-
-import 'package:args/args.dart';
-import 'package:stack_trace/stack_trace.dart';
-import 'package:update_homebrew/update_homebrew.dart';
-
-void main(List<String> args) async {
-  final parser = ArgParser()
-    ..addFlag('dry-run', abbr: 'n')
-    ..addOption('revision', abbr: 'r')
-    ..addOption('channel', abbr: 'c', allowed: supportedChannels)
-    ..addOption('key', abbr: 'k');
-  final options = parser.parse(args);
-  final dryRun = options['dry-run'] as bool;
-  final revision = options['revision'] as String;
-  final channel = options['channel'] as String;
-  if ([revision, channel].contains(null)) {
-    print(
-        "Usage: update_homebrew.dart -r version -c channel [-k ssh_key] [-n]\n"
-        "  ssh_key should allow pushes to $githubRepo on github");
-    exitCode = 1;
-    return;
-  }
-
-  Map<String, String> gitEnvironment;
-
-  final key = options['key'] as String;
-  if (key != null) {
-    final sshWrapper = Platform.script.resolve('ssh_with_key').toFilePath();
-    gitEnvironment = {'GIT_SSH': sshWrapper, 'SSH_KEY_PATH': key};
-  }
-
-  await Chain.capture(() async {
-    var tempDir = await Directory.systemTemp.createTemp('update_homebrew');
-
-    try {
-      var repository = tempDir.path;
-
-      await runGit(['clone', 'git@github.com:$githubRepo.git', '.'], repository,
-          gitEnvironment);
-      await writeHomebrewInfo(channel, revision, repository);
-      await runGit([
-        'commit',
-        '-a',
-        '-m',
-        'Updated $channel branch to revision $revision'
-      ], repository, gitEnvironment);
-      if (dryRun) {
-        await runGit(['diff', 'origin/master'], repository, gitEnvironment);
-      } else {
-        await runGit(['push'], repository, gitEnvironment);
-      }
-    } finally {
-      await tempDir.delete(recursive: true);
-    }
-  }, onError: (error, chain) {
-    print(error);
-    print(chain.terse);
-    exitCode = 1;
-  });
-}
diff --git a/tools/apps/update_homebrew/lib/src/impl.dart b/tools/apps/update_homebrew/lib/src/impl.dart
deleted file mode 100644
index 2a07403..0000000
--- a/tools/apps/update_homebrew/lib/src/impl.dart
+++ /dev/null
@@ -1,65 +0,0 @@
-part of '../update_homebrew.dart';
-
-const _files = [
-  'dartsdk-macos-x64-release.zip',
-  'dartsdk-linux-x64-release.zip',
-  'dartsdk-linux-arm64-release.zip',
-  'dartsdk-linux-ia32-release.zip',
-  'dartsdk-linux-arm-release.zip',
-];
-
-const _host = 'https://storage.googleapis.com/dart-archive/channels';
-
-Future<String> _getHash256(
-    String channel, String version, String download) async {
-  var client = http.Client();
-  try {
-    var api = storage.StorageApi(client);
-    var url = 'channels/$channel/release/$version/sdk/$download.sha256sum';
-    var media = await api.objects.get('dart-archive', url,
-        downloadOptions: DownloadOptions.FullMedia) as Media;
-    var hashLine = await ascii.decodeStream(media.stream);
-    return RegExp('[0-9a-fA-F]*').stringMatch(hashLine);
-  } finally {
-    client.close();
-  }
-}
-
-Future<void> _updateFormula(String channel, File file, String version,
-    Map<String, String> hashes) async {
-  var contents = await file.readAsString();
-
-  // Replace the version identifier. Formulas with stable and pre-release
-  // versions have multiple identifiers and only the right one should be
-  // updated.
-  var versionId = channel == 'stable'
-      ? RegExp(r'version \"\d+\.\d+.\d+\"')
-      : RegExp(r'version \"\d+\.\d+.\d+\-.+\"');
-  contents = contents.replaceAll(versionId, 'version "$version"');
-
-  // Extract files and hashes that are stored in the formula in this format:
-  //  url "<url base>/<channel>/release/<version>/sdk/<artifact>.zip"
-  //  sha256 "<hash>"
-  var filesAndHashes = RegExp(
-      'channels/$channel/release'
-      r'/(\d[\w\d\-\.]*)/sdk/([\w\d\-\.]+)\"\n(\s+)sha256 \"[\da-f]+\"',
-      multiLine: true);
-  contents = contents.replaceAllMapped(filesAndHashes, (m) {
-    var currentVersion = m.group(1);
-    if (currentVersion == version) {
-      throw new ArgumentError(
-          'Channel $channel is already at version $version in homebrew.');
-    }
-    var artifact = m.group(2);
-    var indent = m.group(3);
-    return 'channels/$channel/release/$version/sdk/$artifact"\n'
-        '${indent}sha256 "${hashes[artifact]}"';
-  });
-  await file.writeAsString(contents, flush: true);
-}
-
-Future<Map<String, String>> _getHashes(String channel, String version) async {
-  return <String, String>{
-    for (var file in _files) file: await _getHash256(channel, version, file)
-  };
-}
diff --git a/tools/apps/update_homebrew/lib/update_homebrew.dart b/tools/apps/update_homebrew/lib/update_homebrew.dart
deleted file mode 100644
index e38e51f..0000000
--- a/tools/apps/update_homebrew/lib/update_homebrew.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-import 'dart:async';
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:_discoveryapis_commons/_discoveryapis_commons.dart';
-import 'package:googleapis/storage/v1.dart' as storage;
-import 'package:http/http.dart' as http;
-import 'package:path/path.dart' as p;
-
-part 'src/impl.dart';
-
-const githubRepo = 'dart-lang/homebrew-dart';
-
-const formulaByChannel = {
-  'beta': 'dart-beta.rb',
-  'dev': 'dart.rb',
-  'stable': 'dart.rb'
-};
-
-Iterable<String> get supportedChannels => formulaByChannel.keys;
-
-Future<void> writeHomebrewInfo(
-    String channel, String version, String repository) async {
-  var formula = File(p.join(repository, formulaByChannel[channel]));
-  var hashes = await _getHashes(channel, version);
-  await _updateFormula(channel, formula, version, hashes);
-}
-
-Future<void> runGit(List<String> args, String repository,
-    Map<String, String> gitEnvironment) async {
-  print("git ${args.join(' ')}");
-
-  var result = await Process.run('git', args,
-      workingDirectory: repository, environment: gitEnvironment);
-
-  print(result.stdout);
-  print(result.stderr);
-}
diff --git a/tools/apps/update_homebrew/pubspec.yaml b/tools/apps/update_homebrew/pubspec.yaml
deleted file mode 100644
index 9089614..0000000
--- a/tools/apps/update_homebrew/pubspec.yaml
+++ /dev/null
@@ -1,13 +0,0 @@
-name: update_homebrew
-
-publish_to: none
-environment:
-  sdk: '>=2.0.0 <3.0.0'
-
-dependencies:
-  _discoveryapis_commons: ^0.1.3+1
-  args: ^1.5.0
-  googleapis: ^0.51.0
-  http: ^0.11.1+1
-  path: ^1.4.1
-  stack_trace: ^1.3.2
