Skip to content

Commit 9814d10

Browse files
ericmigiclaude
andcommitted
Release workflow + v0.0.1
- New release.yml: triggers on a v* tag (or manual dispatch with a tag input). Builds :app:assembleRelease, names the APK after the tag, attaches it to a GitHub Release with auto-generated notes plus a copy of the alpha disclaimer. - Release build type now signs with the debug keystore so the APK is installable straight from the artifact — no keystore secrets to manage. Comment in build.gradle calls out that this orphans installs across a future Play-Store keystore rotation, which is fine for an alpha. - versionName bumped 0.1.0 → 0.0.1 for the first cut. (versionCode stays 1.) - README: new "Install" section pointing readers at the Releases page so the signed APK is the front door, not a from-source build. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent e14f559 commit 9814d10

3 files changed

Lines changed: 95 additions & 1 deletion

File tree

.github/workflows/release.yml

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
name: Release APK
2+
3+
on:
4+
push:
5+
tags:
6+
- 'v*'
7+
workflow_dispatch:
8+
inputs:
9+
tag:
10+
description: 'Tag to release (e.g. v0.0.1)'
11+
required: true
12+
default: 'v0.0.1'
13+
14+
permissions:
15+
contents: write
16+
17+
jobs:
18+
release:
19+
runs-on: ubuntu-latest
20+
steps:
21+
- uses: actions/checkout@v4
22+
23+
- uses: actions/setup-java@v4
24+
with:
25+
distribution: temurin
26+
java-version: '17'
27+
28+
- uses: gradle/actions/setup-gradle@v4
29+
30+
- name: Resolve tag
31+
id: tag
32+
run: |
33+
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
34+
echo "name=${{ inputs.tag }}" >> "$GITHUB_OUTPUT"
35+
else
36+
echo "name=${GITHUB_REF#refs/tags/}" >> "$GITHUB_OUTPUT"
37+
fi
38+
39+
- name: Build release APK
40+
run: ./gradlew :app:assembleRelease --no-daemon
41+
42+
- name: Rename APK
43+
run: |
44+
mkdir -p out
45+
cp app/build/outputs/apk/release/app-release.apk \
46+
out/notes-of-fruit-${{ steps.tag.outputs.name }}.apk
47+
48+
- name: Upload as workflow artifact
49+
uses: actions/upload-artifact@v4
50+
with:
51+
name: notes-of-fruit-${{ steps.tag.outputs.name }}
52+
path: out/notes-of-fruit-${{ steps.tag.outputs.name }}.apk
53+
if-no-files-found: error
54+
55+
- name: Create / update GitHub release
56+
uses: softprops/action-gh-release@v2
57+
with:
58+
tag_name: ${{ steps.tag.outputs.name }}
59+
name: ${{ steps.tag.outputs.name }}
60+
generate_release_notes: true
61+
fail_on_unmatched_files: true
62+
files: out/notes-of-fruit-${{ steps.tag.outputs.name }}.apk
63+
body: |
64+
## ⚠️ Alpha — install at your own risk
65+
66+
Notes of Fruit is an unofficial, reverse-engineered Android client
67+
for iCloud Notes. It might corrupt, duplicate, or delete notes in
68+
your iCloud account; drop formatting in subtle ways when round-
69+
tripping through Mac; or stop working at any time if Apple changes
70+
their API. See the [README](https://github.com/${{ github.repository }}#%EF%B8%8F-use-at-your-own-risk).
71+
72+
**Install:** download `notes-of-fruit-${{ steps.tag.outputs.name }}.apk`
73+
below, transfer to your Android device, and install (you may need
74+
to enable "Install unknown apps" for your file manager / browser).
75+
Min Android version: 8.0 (API 26).
76+
77+
The APK is signed with the project's debug keystore — Play Store
78+
distribution will require a real keystore rotation in a future
79+
release.

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@ Mac's Apple Notes and iCloud.com.
77
This is a research codebase, not a polished product. Treat the README as a field
88
report for the next person (or agent) who picks it up.
99

10+
## Install
11+
12+
Grab a signed APK from the [Releases page](../../releases) and side-load it onto an
13+
Android 8.0+ device. Each release's notes link back to the disclaimer below;
14+
read it first.
15+
16+
If you'd rather build from source, see [Build / run](#build--run) further down.
17+
1018
## ⚠️ Use at your own risk
1119

1220
This is **alpha-quality software**. It might:

app/build.gradle.kts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,20 @@ android {
1212
minSdk = 26
1313
targetSdk = 36
1414
versionCode = 1
15-
versionName = "0.1.0"
15+
versionName = "0.0.1"
1616
}
1717

1818
buildTypes {
1919
release {
2020
isMinifyEnabled = false
2121
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
22+
// Sign release builds with the debug key so the APK is installable
23+
// out of the GH Actions artifact without managing keystore secrets.
24+
// The trade-off: a future "real" release that wants Play Store
25+
// distribution must rotate to a fresh keystore, which orphans
26+
// earlier installs (Android won't auto-update across keystores).
27+
// That's acceptable for an alpha.
28+
signingConfig = signingConfigs.getByName("debug")
2229
}
2330
}
2431
compileOptions {

0 commit comments

Comments
 (0)