" } { print }' "$f" > "$f.tmp"
+ mv "$f.tmp" "$f"
+ done
+ - name: Commit and push if changed
+ run: |-
+ git config user.name "GitHub Actions"
+ git config user.email "actions@users.noreply.github.com"
+ git add -A
+ git commit -m "doc: regenerate groff and html man pages" || exit 0
+ git push
diff --git a/.github/workflows/ronn/Dockerfile b/.github/workflows/ronn/Dockerfile
new file mode 100644
index 0000000..f373ec3
--- /dev/null
+++ b/.github/workflows/ronn/Dockerfile
@@ -0,0 +1,8 @@
+FROM ruby:3.0.1-buster
+
+RUN apt-get update && apt-get install -y groff
+RUN bundle config --global frozen 1
+COPY Gemfile Gemfile.lock ./
+RUN bundle install
+ENTRYPOINT ["bash", "-O", "globstar", "-c", \
+ "/usr/local/bundle/bin/ronn **/*.ronn"]
diff --git a/.github/workflows/ronn/Gemfile b/.github/workflows/ronn/Gemfile
new file mode 100644
index 0000000..544b2e3
--- /dev/null
+++ b/.github/workflows/ronn/Gemfile
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+source "https://rubygems.org"
+
+gem "ronn", "~> 0.7.3"
diff --git a/.github/workflows/ronn/Gemfile.lock b/.github/workflows/ronn/Gemfile.lock
new file mode 100644
index 0000000..45c7cd5
--- /dev/null
+++ b/.github/workflows/ronn/Gemfile.lock
@@ -0,0 +1,20 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ hpricot (0.8.6)
+ mustache (1.1.1)
+ rdiscount (2.2.0.2)
+ ronn (0.7.3)
+ hpricot (>= 0.8.2)
+ mustache (>= 0.7.0)
+ rdiscount (>= 1.5.8)
+
+PLATFORMS
+ aarch64-linux
+ x86_64-linux
+
+DEPENDENCIES
+ ronn (~> 0.7.3)
+
+BUNDLED WITH
+ 2.2.15
diff --git a/.github/workflows/ronn/action.yml b/.github/workflows/ronn/action.yml
new file mode 100644
index 0000000..4734499
--- /dev/null
+++ b/.github/workflows/ronn/action.yml
@@ -0,0 +1,4 @@
+name: Ronn
+runs:
+ using: docker
+ image: Dockerfile
diff --git a/HomebrewFormula/age.rb b/HomebrewFormula/age.rb
index bad303d..3e11e4c 100644
--- a/HomebrewFormula/age.rb
+++ b/HomebrewFormula/age.rb
@@ -16,5 +16,7 @@ class Age < Formula
mkdir bin
system "go", "build", "-trimpath", "-o", bin, "-ldflags", "-X main.Version=v#{version}", "filippo.io/age/cmd/..."
prefix.install_metafiles
+ man1.install "doc/age.1"
+ man1.install "doc/age-keygen.1"
end
end
diff --git a/age.go b/age.go
index 0d32d2a..eb4c2ea 100644
--- a/age.go
+++ b/age.go
@@ -35,6 +35,16 @@
// encryption operations. If you need to tie into existing key management
// infrastructure, you might want to consider implementing your own Recipient
// and Identity.
+//
+// Backwards compatibility
+//
+// Files encrypted with a stable version (not alpha, beta, or release candidate)
+// of age, or with any v1.0.0 beta or release candidate, will decrypt with any
+// later versions of the v1 API. This might change in v2, in which case v1 will
+// be maintained with security fixes for compatibility with older files.
+//
+// If decrypting an older file poses a security risk, doing so might require an
+// explicit opt-in in the API.
package age
import (
diff --git a/cmd/age-keygen/keygen.go b/cmd/age-keygen/keygen.go
index 7a42878..e8780f2 100644
--- a/cmd/age-keygen/keygen.go
+++ b/cmd/age-keygen/keygen.go
@@ -27,7 +27,7 @@ Options:
-o, --output OUTPUT Write the result to the file at path OUTPUT.
-y Convert an identity file to a recipients file.
-age-keygen generates a new standard X25519 key pair, and outputs it to
+age-keygen generates a new native X25519 key pair, and outputs it to
standard output or to the OUTPUT file.
If an OUTPUT file is specified, the public key is printed to standard error.
diff --git a/doc/age-keygen.1.ronn b/doc/age-keygen.1.ronn
new file mode 100644
index 0000000..4b29c54
--- /dev/null
+++ b/doc/age-keygen.1.ronn
@@ -0,0 +1,57 @@
+age-keygen(1) -- generate age(1) key pairs
+====================================================
+
+## SYNOPSIS
+
+`age-keygen` [`-o`