diff --git a/README.md b/README.md
index 821c955..35f0218 100644
--- a/README.md
+++ b/README.md
@@ -362,6 +362,14 @@ branch.
   to the upstream repository.
 
 
+### `all_repos.push.readonly`
+
+Does nothing.
+
+#### `push_settings`
+
+There are no configurable settings for `readonly`.
+
 ## Writing your own push module
 
 First create a module.  This module must have the following api:
diff --git a/all_repos/push/readonly.py b/all_repos/push/readonly.py
new file mode 100644
index 0000000..d74af6b
--- /dev/null
+++ b/all_repos/push/readonly.py
@@ -0,0 +1,7 @@
+import collections
+
+Settings = collections.namedtuple('Settings', ())
+
+
+def push(settings: Settings, branch_name: str) -> None:
+    return None

diff --git a/tests/push/readonly_test.py b/tests/push/readonly_test.py
new file mode 100644
index 0000000..eaba410
--- /dev/null
+++ b/tests/push/readonly_test.py
@@ -0,0 +1,6 @@
+from all_repos.push import readonly
+
+
+def test_does_not_fire_missiles():
+    # does nothing, assert it doesn't crash
+    readonly.push(readonly.Settings(), 'branch')

Allow a "read only" mode where `push_settings` are optional
Basically make the configuration lazily load the various parts for pushing / pulling

This would enable one to make a r/o all-repos

I guess this could just be implemented as a builtin `noop` push and then:

```json
    "push": "all_repos.push.noop",
    "push_settings": {}
```
tests/push/readonly_test.py::test_does_not_fire_missiles