feat(site,docs): Tane is in F-Droid — link it next to Play
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:
parent
30024ca977
commit
1f3c7975eb
6 changed files with 59 additions and 8 deletions
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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; }
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue