feat(site,docs): Tane is in F-Droid — link it next to Play
All checks were successful
ci / analyze (push) Successful in 1m3s
ci / test-commons-core (push) Successful in 36s
ci / test-app-seeds (push) Successful in 6m1s
site / deploy (push) Successful in 34s

The inclusion MR was merged on 2026-07-25 and the app page went live on
2026-07-28 (v0.1.16, no antifeatures), so the landing page can finally
offer both stores.

- site: publish the F-Droid link and give each store link a single-colour
  icon, so the two are told apart by shape (play triangle vs. the
  free-software robot) rather than by brand colour. The badge row is a
  flex row now: left-aligned in the hero, centred under "Get Tane".
- README: an Install section with both stores, and a Status that matches
  reality (Block 1 shipped, Block 2 under way) instead of "early design".
- release.md: record that the app is published, that further releases only
  need a versionCode bump in the fdroiddata recipe, and that publication
  lags the green build by a day or two.
- open-decisions.md: log what unblocked inclusion — reproducible
  developer-signed builds, a Google-free APK, and opt-in networking.
This commit is contained in:
vjrj 2026-07-28 11:55:54 +02:00
parent 30024ca977
commit 1f3c7975eb
6 changed files with 59 additions and 8 deletions

View file

@ -9,9 +9,16 @@ The name honors the old Japanese mutual-aid traditions around rice — *yui* (sh
- Web: https://tane.comunes.org - Web: https://tane.comunes.org
- Package id: `org.comunes.tane` - Package id: `org.comunes.tane`
## Install
Android, same signature in both stores — you can switch between them without reinstalling:
- **F-Droid**: https://f-droid.org/packages/org.comunes.tane/ (reproducible, developer-signed build)
- **Google Play**: https://play.google.com/store/apps/details?id=org.comunes.tane
## Status ## Status
Early design. See [`PLAN.md`](PLAN.md) for the full analysis and roadmap (in Spanish). The valuable prior work lives in [`docs/mockups/`](docs/mockups/). Block 1 (inventory) is shipped and in beta; Block 2 (the social layer) is under way. See [`PLAN.md`](PLAN.md) for the full analysis and roadmap (in Spanish) and [`docs/design/open-decisions.md`](docs/design/open-decisions.md) for the live decision log. The valuable prior work lives in [`docs/mockups/`](docs/mockups/).
## Principles ## Principles

View file

@ -34,6 +34,8 @@ Estas fijan `schemaVersion = 1` y el arranque técnico:
- **Paquete legal + moderación mínima — DECIDIDO/IMPLEMENTADO (2026-07-13).** Se escribe la capa legal completa en [`docs/legal/`](../legal/README.md): política de privacidad, condiciones de uso, normas de la comunidad y aviso sobre legalidad de semillas (masters en inglés + espejo es), más docs internos de cumplimiento (Play Data Safety/UGC, notas Apple, memoria jurídica con calendario de revisión — el PRM europeo sigue en trílogos). Decisiones que fija: **(a)** consentimiento único **al entrar al mercado por primera vez** (hoja modal con las normas; el inventario local no pide nada — progressive disclosure), con la misma bandera guardando también publicar-oferta y primer DM; **(b)** **bloqueo local** de claves (keystore, sin migración de esquema): filtra ofertas, chats y DMs entrantes; **(c)** **denuncias estándar NIP-56** (kind 1984) publicadas a los relays + ocultación local; en `relay.comunes.org` (nuestro) se actúa sobre ellas — esa es la historia de "moderación con respuesta" para la revisión de Play; **(d)** se reafirma **cero comisiones** sobre semillas y **Ğ1 solo como etiqueta de precio** (sin flujos de pago in-app, precedente Damus/Apple); **(e)** borrado honesto: NIP-09 es best-effort y así se cuenta al usuario. Metadata de tienda en `fastlane/metadata/android/` (la reutiliza F-Droid). - **Paquete legal + moderación mínima — DECIDIDO/IMPLEMENTADO (2026-07-13).** Se escribe la capa legal completa en [`docs/legal/`](../legal/README.md): política de privacidad, condiciones de uso, normas de la comunidad y aviso sobre legalidad de semillas (masters en inglés + espejo es), más docs internos de cumplimiento (Play Data Safety/UGC, notas Apple, memoria jurídica con calendario de revisión — el PRM europeo sigue en trílogos). Decisiones que fija: **(a)** consentimiento único **al entrar al mercado por primera vez** (hoja modal con las normas; el inventario local no pide nada — progressive disclosure), con la misma bandera guardando también publicar-oferta y primer DM; **(b)** **bloqueo local** de claves (keystore, sin migración de esquema): filtra ofertas, chats y DMs entrantes; **(c)** **denuncias estándar NIP-56** (kind 1984) publicadas a los relays + ocultación local; en `relay.comunes.org` (nuestro) se actúa sobre ellas — esa es la historia de "moderación con respuesta" para la revisión de Play; **(d)** se reafirma **cero comisiones** sobre semillas y **Ğ1 solo como etiqueta de precio** (sin flujos de pago in-app, precedente Damus/Apple); **(e)** borrado honesto: NIP-09 es best-effort y así se cuenta al usuario. Metadata de tienda en `fastlane/metadata/android/` (la reutiliza F-Droid).
- **Distribución en F-Droid — HECHO (2026-07-28).** Tane está publicada en el repo oficial de F-Droid (<https://f-droid.org/packages/org.comunes.tane/>, v0.1.16) **sin antifeatures**: la MR de inclusión ([43144](https://gitlab.com/fdroid/fdroiddata/-/merge_requests/43144)) se aceptó el 2026-07-25. Lo que lo desbloqueó: **(a)** build **reproducible y firmada por nosotros** (`AllowedAPKSigningKeys` + `binary:` por ABI ⇒ misma firma que Play, se puede cambiar de tienda sin reinstalar); **(b)** APK libre de Google (sin GMS) con splits por ABI; **(c)** **red opt-in** desde v0.1.16 — la app no abre ningún socket hasta que la persona activa compartir, lo que sostuvo el rechazo de `NonFreeNet`/`TetheredNet` (protocolo abierto, relays configurables). Consecuencia operativa: cada versión nueva solo requiere subir los `versionCode` por ABI en la receta de `fdroiddata`. → [release.md](../release.md)
## C) Puede esperar (no bloquea nada ahora) ## C) Puede esperar (no bloquea nada ahora)
- Negación plausible / bóveda señuelo; modo discreto. → security-privacy - Negación plausible / bóveda señuelo; modo discreto. → security-privacy

View file

@ -147,11 +147,22 @@ page but does not by itself make the app available in a new country.
## Publish to F-Droid (official repo) ## Publish to F-Droid (official repo)
**Tane is live in F-Droid** since 2026-07-28 (v0.1.16, no antifeatures):
<https://f-droid.org/packages/org.comunes.tane/>. The inclusion MR
([43144](https://gitlab.com/fdroid/fdroiddata/-/merge_requests/43144)) was merged
on 2026-07-25; from now on each release only needs the recipe in `fdroiddata`
master bumped, not a new inclusion request. Note that publication lags the green
build by a day or two — check `repo/status/build.json` before assuming breakage.
F-Droid builds from source after a merge request to `fdroiddata`. The build recipe F-Droid builds from source after a merge request to `fdroiddata`. The build recipe
is kept in-repo at [`fdroid/org.comunes.tane.yml`](fdroid/org.comunes.tane.yml). is kept in-repo at [`fdroid/org.comunes.tane.yml`](fdroid/org.comunes.tane.yml).
Copy it to `metadata/org.comunes.tane.yml` in a fork of fdroiddata, validate with Copy it to `metadata/org.comunes.tane.yml` in a fork of fdroiddata, validate with
`fdroid lint` / `fdroid build -l org.comunes.tane`, then open the MR `fdroid lint` / `fdroid build -l org.comunes.tane`, then open the MR.
([43144](https://gitlab.com/fdroid/fdroiddata/-/merge_requests/43144)).
Every version bump **must** advance the recipe's per-ABI `versionCode`s
(`build × 10 + ABI offset`) together with the `pubspec.yaml` bump — otherwise the
`fdroid_reference` job fails, and a bad tag cannot be fixed by re-tagging (Play
rejects a reused versionCode): cut the next version instead.
**Reproducible, developer-signed.** The recipe pins `AllowedAPKSigningKeys` (the **Reproducible, developer-signed.** The recipe pins `AllowedAPKSigningKeys` (the
SHA-256 of the tane-upload certificate) and a `binary:` URL per ABI. F-Droid SHA-256 of the tane-upload certificate) and a `binary:` URL per ABI. F-Droid

View file

@ -219,7 +219,14 @@ h2 { font-size: clamp(1.4rem, 3vw, 1.9rem); color: var(--green-dark); }
.values li { margin: .45rem 0; } .values li { margin: .45rem 0; }
.get-it { text-align: center; } .get-it { text-align: center; }
.store-badges { margin-top: 1.2rem; } .store-badges {
margin-top: 1.2rem;
display: flex;
flex-wrap: wrap;
gap: .6rem;
justify-content: inherit;
}
.get-it .store-badges { justify-content: center; }
.coming-soon { color: var(--muted); font-style: italic; } .coming-soon { color: var(--muted); font-style: italic; }
.badge { .badge {
display: inline-block; display: inline-block;
@ -231,6 +238,14 @@ h2 { font-size: clamp(1.4rem, 3vw, 1.9rem); color: var(--green-dark); }
margin: .3rem; margin: .3rem;
font-weight: 600; font-weight: 600;
} }
/* Store links: same pill, one-colour icon so Play and F-Droid read apart. */
.badge-store {
display: inline-flex;
align-items: center;
gap: .55rem;
margin: 0;
}
.badge-store .store-icon { flex: none; }
/* Legal docs */ /* Legal docs */
.doc { padding: 2rem 0 3rem; max-width: 760px; } .doc { padding: 2rem 0 3rem; max-width: 760px; }

View file

@ -16,7 +16,7 @@ enableGitInfo = false
license = "AGPL-3.0" license = "AGPL-3.0"
# Links rendered only when set, so nothing broken shows before they exist: # Links rendered only when set, so nothing broken shows before they exist:
playStoreURL = "https://play.google.com/store/apps/details?id=org.comunes.tane" # Google Play playStoreURL = "https://play.google.com/store/apps/details?id=org.comunes.tane" # Google Play
fdroidURL = "" # F-Droid, once published fdroidURL = "https://f-droid.org/packages/org.comunes.tane/" # F-Droid, published 2026-07-28
sourceURL = "https://git.comunes.org/comunes/tane" # public source repository (AGPL) sourceURL = "https://git.comunes.org/comunes/tane" # public source repository (AGPL)
weblateURL = "https://translate.comunes.org/projects/tane/" # translation platform weblateURL = "https://translate.comunes.org/projects/tane/" # translation platform

View file

@ -1,10 +1,26 @@
{{- /* Renders store links only when configured, so nothing broken shows pre-launch. */ -}} {{- /* Renders store links only when configured, so nothing broken shows pre-launch.
Icons are single-colour (currentColor) so the two stores are told apart by
shape, not by brand colour: a play triangle vs. the free-software robot. */ -}}
<div class="store-badges"> <div class="store-badges">
{{- with .Site.Params.playStoreURL -}} {{- with .Site.Params.playStoreURL -}}
<a class="badge" href="{{ . }}">Google Play</a> <a class="badge badge-store" href="{{ . }}">
<svg class="store-icon" aria-hidden="true" viewBox="0 0 24 24" width="22" height="22">
<path fill="currentColor" d="M4.6 2.1c-.3.2-.5.6-.5 1v17.8c0 .4.2.8.5 1l9.5-9.9-9.5-9.9zm10.9 8.5L6.2 1.4l11.4 6.6-2.1 2.6zM6.2 22.6l9.3-9.2 2.1 2.6-11.4 6.6zm12.6-7.3-2.4-2.9 2.4-2.9 2.7 1.6c.7.4.7 1.4 0 1.8l-2.7 1.6z"/>
</svg>
<span>Google Play</span>
</a>
{{- end -}} {{- end -}}
{{- with .Site.Params.fdroidURL -}} {{- with .Site.Params.fdroidURL -}}
<a class="badge" href="{{ . }}">F-Droid</a> <a class="badge badge-store" href="{{ . }}">
<svg class="store-icon" aria-hidden="true" viewBox="0 0 24 24" width="22" height="22">
<g fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round">
<path d="M8.1 2.6 9.8 5.7"/>
<path d="M15.9 2.6 14.2 5.7"/>
</g>
<path fill="currentColor" fill-rule="evenodd" d="M7.3 6.4h9.4c1.8 0 3.3 1.5 3.3 3.3v8.6c0 1.8-1.5 3.3-3.3 3.3H7.3A3.3 3.3 0 0 1 4 18.3V9.7c0-1.8 1.5-3.3 3.3-3.3zm1.8 4.8a1.4 1.4 0 1 0 0 2.8 1.4 1.4 0 0 0 0-2.8zm5.8 0a1.4 1.4 0 1 0 0 2.8 1.4 1.4 0 0 0 0-2.8z"/>
</svg>
<span>F-Droid</span>
</a>
{{- end -}} {{- end -}}
{{- if and (not .Site.Params.playStoreURL) (not .Site.Params.fdroidURL) -}} {{- if and (not .Site.Params.playStoreURL) (not .Site.Params.fdroidURL) -}}
<p class="coming-soon">{{ T "getItComingSoon" }}</p> <p class="coming-soon">{{ T "getItComingSoon" }}</p>