Skip to content

Commit 3ceb7b9

Browse files
committed
docs: document F-Droid, reproducible builds, and release checksums
1 parent 8afaf23 commit 3ceb7b9

4 files changed

Lines changed: 62 additions & 3 deletions

File tree

README.md

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<p align="center">
22
<a href="https://github.com/anywherelan/awl/blob/master/LICENSE"><img alt="GitHub license" src="https://img.shields.io/github/license/anywherelan/awl?color=brightgreen"></a>
33
<a href="https://github.com/anywherelan/awl/releases"><img alt="GitHub release" src="https://img.shields.io/github/v/release/anywherelan/awl" /></a>
4+
<a href="https://f-droid.org/packages/com.anywherelan.awl/"><img alt="F-Droid" src="https://img.shields.io/f-droid/v/com.anywherelan.awl" /></a>
45
<a href="https://github.com/anywherelan/awl/actions/workflows/test.yml"><img alt="Test build status" src="https://github.com/anywherelan/awl/actions/workflows/test.yml/badge.svg" /></a>
56
</p>
67

@@ -13,6 +14,7 @@
1314
- [Screenshots](#camera-screenshots)
1415
- [How it works](#how-it-works)
1516
- [Security](#security)
17+
- [Reproducible builds](#reproducible-builds)
1618
- [Installation](#installation)
1719
- [The web UI](#the-web-ui)
1820
- [Android](#android)
@@ -113,6 +115,13 @@ awl's transport security comes from [libp2p](https://docs.libp2p.io/).
113115
- **Key compromise:** there is no revocation mechanism. If an identity key leaks, generate a new one and re-add peers.
114116
- **Metadata:** nodes participating in the DHT can observe which peer IDs are online and being looked up. Packet contents are end-to-end encrypted and not visible to them.
115117

118+
## Reproducible builds
119+
120+
awl's release binaries are built reproducibly on every platform. Builds run in public GitHub Actions from tagged source (see the [build workflow](.github/workflows/build-manual.yml) and [`build.sh`](build.sh)), using `-trimpath` and `-buildid=` with pinned dependencies, so the same source produces byte-identical output.
121+
122+
- **Android:** the app is independently reproducible-verified: F-Droid rebuilds the application from source and verifies that the resulting APK matches the APK published in the GitHub Releases. See its [reproducibility status](https://verification.f-droid.org/packages/com.anywherelan.awl/).
123+
- **Desktop:** every GitHub release includes SHA-256 checksums for its archives. You can independently reproduce a release yourself by building the same tag according to [`BUILDING.md`](BUILDING.md) and verifying that the checksums match.
124+
116125
# Installation
117126

118127
awl ships in two desktop flavors:
@@ -130,7 +139,10 @@ Once awl is running, open **http://admin.awl** in a browser. `admin.awl` is a ma
130139

131140
## Android
132141

133-
Install the APK from the [releases page](https://github.com/anywherelan/awl/releases) and open the app.
142+
<a href="https://f-droid.org/packages/com.anywherelan.awl/"><img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png" alt="Get it on F-Droid" height="80"></a>
143+
<a href="https://github.com/anywherelan/awl/releases"><img src="docs/images/badge_github.png" alt="Get it on GitHub" height="80"></a>
144+
145+
Get it from [F-Droid](https://f-droid.org/packages/com.anywherelan.awl/), or download the APK directly from the [GitHub releases page](https://github.com/anywherelan/awl/releases). Both are the same app; F-Droid notifies you of new versions.
134146

135147
## Windows (`awl-tray`)
136148

@@ -464,7 +476,7 @@ On desktop (`awl-tray`) you can upgrade application by clicking system tray icon
464476

465477
### Android
466478

467-
Awl is not yet published in any store, so the only option is to download new version .apk from the [releases page](https://github.com/anywherelan/awl/releases) and install it manually.
479+
Update via [F-Droid](https://f-droid.org/packages/com.anywherelan.awl/), or download the latest .apk from the [releases page](https://github.com/anywherelan/awl/releases) and install it manually.
468480

469481
### Server
470482

docs/images/badge_github.png

15.2 KB
Loading

tools/generate_release_info.go

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@
33
package main
44

55
import (
6+
"crypto/sha256"
67
_ "embed"
8+
"encoding/hex"
79
"flag"
810
"html/template"
11+
"io"
912
"os"
13+
"path/filepath"
1014
"sort"
1115
"strings"
1216
)
@@ -17,6 +21,7 @@ var releaseDescriptionTemplate string
1721
func main() {
1822
var buildPath string
1923
flag.StringVar(&buildPath, "build_path", "build", "directory with build files")
24+
flag.Parse()
2025

2126
files, err := os.ReadDir(buildPath)
2227
if err != nil {
@@ -30,6 +35,7 @@ func main() {
3035
var awlTrayWindows []string
3136
var awlTrayWindows7 []string
3237
var awlTrayMacos []string
38+
var checksums []checksum
3339

3440
for _, file := range files {
3541
if file.IsDir() {
@@ -54,7 +60,16 @@ func main() {
5460
awlTrayWindows = append(awlTrayWindows, filename)
5561
case strings.HasPrefix(filename, "awl-tray-macos"):
5662
awlTrayMacos = append(awlTrayMacos, filename)
63+
default:
64+
// not a release asset, skip it from downloads and checksums
65+
continue
66+
}
67+
68+
hash, err := sha256File(filepath.Join(buildPath, filename))
69+
if err != nil {
70+
panic(err)
5771
}
72+
checksums = append(checksums, checksum{Name: filename, Hash: hash})
5873
}
5974

6075
sort.Strings(awlLinux)
@@ -64,6 +79,9 @@ func main() {
6479
sort.Strings(awlTrayWindows)
6580
sort.Strings(awlTrayWindows7)
6681
sort.Strings(awlTrayMacos)
82+
sort.Slice(checksums, func(i, j int) bool {
83+
return checksums[i].Name < checksums[j].Name
84+
})
6785

6886
releaseTag := strings.TrimPrefix(awlAndroid, "awl-android-")
6987
releaseTag = strings.TrimSuffix(releaseTag, ".apk")
@@ -73,7 +91,7 @@ func main() {
7391
panic(err)
7492
}
7593

76-
data := map[string]interface{}{
94+
data := map[string]any{
7795
"ReleaseTag": releaseTag,
7896
"AwlAndroid": awlAndroid,
7997
"AwlLinux": awlLinux,
@@ -83,10 +101,31 @@ func main() {
83101
"AwlTrayWindows": awlTrayWindows,
84102
"AwlTrayWindows7": awlTrayWindows7,
85103
"AwlTrayMacos": awlTrayMacos,
104+
"Checksums": checksums,
86105
}
87106

88107
err = temp.Execute(os.Stdout, data)
89108
if err != nil {
90109
panic(err)
91110
}
92111
}
112+
113+
type checksum struct {
114+
Name string
115+
Hash string
116+
}
117+
118+
func sha256File(path string) (string, error) {
119+
file, err := os.Open(path)
120+
if err != nil {
121+
return "", err
122+
}
123+
defer file.Close()
124+
125+
h := sha256.New()
126+
if _, err := io.Copy(h, file); err != nil {
127+
return "", err
128+
}
129+
130+
return hex.EncodeToString(h.Sum(nil)), nil
131+
}

tools/release-description-template.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,11 @@ For instructions on how to install anywherelan [see readme](https://github.com/a
4444

4545
{{range .AwlWindows7}}
4646
[{{.}}](https://github.com/anywherelan/awl/releases/download/{{$.ReleaseTag}}/{{.}}) {{end}}
47+
48+
## Checksums (SHA-256)
49+
50+
Verify a downloaded file with `sha256sum -c` (or `shasum -a 256 -c`). Anywherelan's builds are reproducible — see [Reproducible builds](https://github.com/anywherelan/awl#reproducible-builds).
51+
52+
```
53+
{{range .Checksums}}{{.Hash}} {{.Name}}
54+
{{end}}```

0 commit comments

Comments
 (0)