Commit graph

295 commits

Author SHA1 Message Date
9b0ef1fc40 chore(release): v0.1.7 (+9) — reference APKs via fdroid buildserver
Some checks failed
ci / test-commons-core (push) Successful in 44s
ci / analyze (push) Successful in 1m27s
site / deploy (push) Successful in 29s
ci / test-app-seeds (push) Successful in 8m51s
release / fdroid_reference (push) Failing after 1m32s
release / play (push) Successful in 17m48s
2026-07-19 09:32:39 +02:00
b906161d70 ci(release): produce F-Droid reference APKs via fdroid build in buildserver image, then sign 2026-07-19 08:56:54 +02:00
654ed1fe68 ci(release): route dead jcenter deps to mavenCentral; v0.1.6 (+8)
Some checks failed
ci / test-commons-core (push) Successful in 1m3s
ci / analyze (push) Successful in 2m2s
ci / test-app-seeds (push) Successful in 10m51s
release / android (push) Failing after 17m23s
2026-07-19 07:09:07 +02:00
bbd8d3580f chore(release): v0.1.5 (+7) — retag with tesseract build fix
Some checks failed
ci / test-commons-core (push) Successful in 50s
ci / analyze (push) Successful in 1m39s
ci / test-app-seeds (push) Successful in 10m14s
release / android (push) Failing after 20m15s
2026-07-19 06:38:21 +02:00
f968f64de8 ci(release): fix tesseract build — use root gradlew with :tesseract4android task 2026-07-19 06:36:25 +02:00
a575f01207 ci(release): build tesseract4android from source for F-Droid reproducibility; v0.1.4 (+6)
Some checks failed
ci / test-commons-core (push) Successful in 1m27s
ci / analyze (push) Successful in 2m17s
release / android (push) Failing after 4m50s
ci / test-app-seeds (push) Successful in 10m40s
2026-07-19 06:18:04 +02:00
b76083be57 chore(release): v0.1.3 (+5) — reproducible developer-signed F-Droid
All checks were successful
ci / test-commons-core (push) Successful in 1m0s
ci / analyze (push) Successful in 1m55s
site / deploy (push) Successful in 34s
ci / test-app-seeds (push) Successful in 11m39s
release / android (push) Successful in 24m33s
2026-07-19 00:03:53 +02:00
1a826477f2 feat(app): hint isolation distance when sowing a cross-pollinating crop
Some checks failed
ci / test-commons-core (push) Successful in 58s
ci / analyze (push) Successful in 1m49s
site / deploy (push) Successful in 38s
ci / test-app-seeds (push) Has been cancelled
One passive line in the batch story after a 'sown today' tap — 'this
species crosses, grow it ~400 m from others' — sourced from the bundled
seed-saving guidance (family default + species override). Selfers get
nothing: the trap is recording isolation religiously for beans where it
never mattered. No input fields, no schema change.
2026-07-18 12:31:42 +02:00
f1aa8f8e66 feat(app): scan a printed seed label back into its record
Closes the physical↔digital loop the labels opened: the QR on a printed
envelope (tane://seed, already encoded by seed_label_codec) can now be
scanned from the inventory bar. A known label opens its variety; an
unknown one asks before adding anything, then creates the variety (species
linked by exact scientific name when bundled) with a lot carrying the
label's year and origin. Scanner is pure ZXing (zxing_barcode_scanner,
MIT) — no ML Kit, no Play Services, F-Droid-safe, the stack Ğ1nkgo ships.
Mobile-only; other platforms don't show the button (OCR precedent).
The post-scan flow is a plain function (handleScannedPayload) so it's
widget-tested without a camera.
2026-07-18 12:26:27 +02:00
bb5b3d4a43 feat(app): ask 'how did it do?' when a harvest is noted (schema v13)
The note growers most wish they had two seasons later — did it do well,
was it worth keeping — never had a home. New append-only GardenOutcomes
table (lotId, season year, three-face rating, free note); the question
appears ONCE, inline, right after recording a harvest in the batch story,
and is skippable without a trace. The answer shows as one more story
line. Rides backups/sync like every mutable table (JSON codec, LWW
import, HLC clock absorb). Migration v12→v13 guarded + verified from
every historical version.
2026-07-18 12:18:25 +02:00
92fd84590b feat(app): show each batch's story as a composite timeline
The Movement log (history + provenance DAG) was recorded but invisible.
A new history sheet on every lot tile narrates the batch: movements,
germination tests, storage checks and how it entered the collection
(origin attached), most-recent first. Two one-tap chips record 'sown
today' / 'harvested today' — the first UI door to the sown/harvested
movement types. No schema change; one-shot reads only (no live
subscriptions in a transient sheet).
2026-07-18 06:25:55 +02:00
11cbdf3022 docs(site): document the automatic Forgejo Actions deploy
All checks were successful
ci / test-commons-core (push) Successful in 56s
ci / analyze (push) Successful in 1m51s
site / deploy (push) Successful in 36s
ci / test-app-seeds (push) Successful in 7m10s
The manual Ansible playbook was superseded by the site.yml workflow,
which deploys on every push to main touching site/** or docs/**.
Keep Ansible documented only as the manual fallback.
2026-07-18 00:30:05 +02:00
0aa8dd91ab feat(site): show discreet # permalinks on landing section titles
All checks were successful
ci / test-commons-core (push) Successful in 49s
ci / analyze (push) Successful in 1m34s
site / deploy (push) Successful in 36s
ci / test-app-seeds (push) Successful in 6m19s
The landing sections had ids but no visible anchor, unlike About/Legal.
Add a hover-revealed # link on each section title (Status, Features,
Screenshots, Values, FAQ, Collaborate, Get it) and widen the reveal rule
beyond .doc so it applies to the home too.
2026-07-17 17:36:32 +02:00
8bec7dcde2 feat(android): split release APK per ABI for F-Droid
All checks were successful
release / android (push) Successful in 13m47s
Adds a versionCodeOverride to build.gradle.kts (F-Droid requires distinct
versionCodes per split APK; Google Play's App Bundle is unaffected since
this only touches the application-variant/APK output). Bumps to 0.1.2+4.

Verified locally: flutter build apk --release --split-per-abi produces
app-{armeabi-v7a,arm64-v8a,x86_64}-release.apk with versionCode 31/32/33.
2026-07-17 17:36:18 +02:00
bfd29f19b9 feat(site): add section and heading anchors for deep-linking
All checks were successful
ci / test-commons-core (push) Successful in 44s
ci / analyze (push) Successful in 1m25s
site / deploy (push) Successful in 32s
ci / test-app-seeds (push) Successful in 5m51s
Landing sections now carry ids (status, features, faq, collab, …) so any
section is directly linkable (e.g. /#faq). About and Legal headings get a
discreet, hover-revealed permalink via a goldmark heading render hook.
A scroll-margin-top offset keeps anchored targets clear of the sticky header.
2026-07-17 17:28:39 +02:00
b0325fd40d feat(site): mention saved-search alerts on the landing page
All checks were successful
ci / test-commons-core (push) Successful in 47s
ci / analyze (push) Successful in 1m31s
site / deploy (push) Successful in 33s
ci / test-app-seeds (push) Successful in 6m8s
Add the saved-searches-with-alerts market feature to the "share and
stay connected" list, EN and ES.
2026-07-17 13:34:46 +02:00
87e87abc7c chore(i18n): regenerate strings.g.dart (slang)
All checks were successful
ci / test-commons-core (push) Successful in 43s
ci / analyze (push) Successful in 1m23s
ci / test-app-seeds (push) Successful in 5m48s
2026-07-17 13:18:29 +02:00
93028c4933 feat(market): saved searches with in-app alerts (Wallapop-style)
Save the current market search (query + facets) and get notified when a
matching offer appears in your zone while the app is open, with a catch-up
scan on start. Adds a save affordance in the search bar, a saved-searches
list (apply/delete) with a per-search new-match badge, an AppBar entry
badged with the unseen total, and notification-tap routing to the list.
Alerts evaluate against the user's current area, dedup via seen keys, and
skip own/blocked/hidden/non-active offers. en+es strings.
2026-07-17 13:18:29 +02:00
c0cd299408 feat(social): add SavedSearchAlertService + notification alerts channel
One discovery subscription over the shared connection for the user's
current zone; matches each incoming offer against saved searches and
fires a text-free OS alert on the new 'alerts' channel for fresh matches.
Skips own/blocked/hidden/non-active offers and dedups via seen keys. The
replay-on-connect doubles as the catch-up scan. Notification payloads are
now prefixed so taps route to chat or the saved search.
2026-07-17 13:18:29 +02:00
530bf96358 feat(social): add SavedSearchesStore with alert bookkeeping
Keystore-backed, account-scoped store mirroring SavedOffersStore. Tracks
per-search seen keys (dedup, capped 500) and unread match keys (badge
source), with markMatched/markViewed/newMatchCount and a changes stream.
2026-07-17 13:18:29 +02:00
5b1066a224 feat(social): add SavedSearch model with shared offer matcher
Extract the market's query/type/category/organic filter chain into
SavedSearch.matchesFilters so live results and saved-search alerts can
never disagree. OffersState.visibleOffers now delegates to it.
2026-07-17 13:18:29 +02:00
dd9c97a57a feat(site): human-language 'what you can do' features section
All checks were successful
ci / test-commons-core (push) Successful in 46s
ci / analyze (push) Successful in 1m23s
site / deploy (push) Successful in 31s
ci / test-app-seeds (push) Successful in 5m52s
Add a features section to the landing home (EN/ES) that describes what
Tane does by intent, not mechanism: inventory, care & calendar, labels &
backup, and the neighbourly sharing layer (offers, chat, trust, plantaré,
sync). Follows the existing pillars/values pattern (front-matter data +
template + CSS, RTL-safe). Reframe the beta status copy so the sharing
layer reads as 'arriving, in beta' rather than 'being built'.
2026-07-17 12:52:47 +02:00
75098b8029 docs(about): age range 10-99, link 'translate' to Weblate
All checks were successful
ci / test-commons-core (push) Successful in 43s
ci / analyze (push) Successful in 1m26s
site / deploy (push) Successful in 27s
ci / test-app-seeds (push) Successful in 5m47s
2026-07-17 12:23:45 +02:00
e321447f9d chore(i18n): regenerate strings.g.dart (slang)
All checks were successful
ci / analyze (push) Successful in 2m15s
ci / test-commons-core (push) Successful in 1m6s
ci / test-app-seeds (push) Successful in 8m25s
2026-07-17 09:25:20 +02:00
d27dc1c553 chore(release): v0.1.1 (+3) — GMS-free build
Some checks failed
ci / test-commons-core (push) Successful in 43s
ci / analyze (push) Successful in 1m23s
site / deploy (push) Successful in 25s
ci / test-app-seeds (push) Has been cancelled
release / android (push) Failing after 10m57s
Bumps to 0.1.1+3 (versionCode 3). Adds CHANGELOG [0.1.1], fastlane
changelogs (en-US, es-ES) for versionCode 3, and a 0.1.1 build entry in
the F-Droid recipe (commit v0.1.1, CurrentVersion/Code 3).
2026-07-17 09:19:16 +02:00
d0fabb80a9 fix(android): drop geolocator for a native LocationManager channel
Removes the geolocator dependency, which transitively embedded
com.google.android.gms.* (play-services-location) — proprietary classes
that F-Droid's scanner rejects. The optional coarse-location button now
talks to Android's own LocationManager over a small platform channel
(org.comunes.tane/coarse_location): permission prompt, single coarse fix
with a 12s timeout, last-known fallback, null on any failure. Behavior
is unchanged and the CoarseLocationProvider interface is preserved, so
the UI, i18n and widget tests need no changes.

Also sets dependenciesInfo.includeInApk/Bundle = false so the AGP
dependency-metadata block (also flagged by F-Droid) is not embedded.
Neither change affects the Google Play build.
2026-07-17 09:19:05 +02:00
7f1118a243 docs(fdroid): fix recipe for F-Droid CI (build chown, checkupdates, schema)
All checks were successful
ci / test-commons-core (push) Successful in 43s
ci / analyze (push) Successful in 1m24s
site / deploy (push) Successful in 25s
ci / test-app-seeds (push) Successful in 5m43s
- chown /opt/flutter to vagrant (build runs as non-root; fixes cache write)
- AutoUpdateMode: Version (drop invalid 'v%v' per schema)
- UpdateCheckMode: Tags v[\d.]+ + UpdateCheckData reading version from
  apps/app_seeds/pubspec.yaml (Flutter versionCode isn't a literal in gradle)
Validated locally: schema, lint, checkupdates (exit 0), and flutter build as vagrant.
2026-07-17 08:26:27 +02:00
ab66f2fdf1 docs(fdroid): fit categories (Inventory/Market) + versionCode 2
All checks were successful
ci / test-commons-core (push) Successful in 45s
ci / analyze (push) Successful in 1m28s
site / deploy (push) Successful in 29s
ci / test-app-seeds (push) Successful in 5m51s
Categories now Inventory + Market & Price + Science & Education (F-Droid has no
'Tools'; these match the app). Build entry and CurrentVersionCode bumped to 2 to
match the shipped 0.1.0 release. Description/screenshots come from the fastlane
metadata tree, not this recipe.
2026-07-17 07:31:47 +02:00
4fc343e57d Update gitignore 2026-07-16 22:21:27 +02:00
d8f5370220 fix(site): typo in SITE_DEST
Some checks failed
ci / analyze (push) Successful in 1m28s
ci / test-commons-core (push) Successful in 51s
ci / test-app-seeds (push) Successful in 7m42s
release / android (push) Failing after 17m6s
2026-07-16 21:42:25 +02:00
46e5148385 Trying to fix deploy
All checks were successful
ci / analyze (push) Successful in 1m19s
ci / test-commons-core (push) Successful in 44s
ci / test-app-seeds (push) Successful in 7m25s
2026-07-16 21:31:18 +02:00
1a49376d84 ci(site): disable auto-deploy (runner can't reach groucho over SSH)
All checks were successful
ci / analyze (push) Successful in 1m9s
ci / test-commons-core (push) Successful in 38s
ci / test-app-seeds (push) Successful in 5m40s
aaron routes to groucho via ada (ens18 down); the groucho->aaron data path drops
packets so the SSH banner never returns (TCP+ICMP ok). Left workflow_dispatch-only
until the network is fixed; deploy meanwhile via ansible tane-landing.yml.
2026-07-16 18:41:14 +02:00
89e3287146 ci(site): auto-deploy landing to groucho on push to main
All checks were successful
ci / analyze (push) Successful in 1m9s
ci / test-commons-core (push) Successful in 37s
ci / test-app-seeds (push) Successful in 6m4s
2026-07-16 16:45:20 +02:00
8e177ef00f feat(site): publish Google Play link now that the app is live
All checks were successful
ci / analyze (push) Successful in 1m8s
ci / test-commons-core (push) Successful in 38s
ci / test-app-seeds (push) Successful in 5m56s
Set playStoreURL so the store-badges partial renders the Google Play
badge (id=org.comunes.tane) on the landing page.
2026-07-16 16:20:37 +02:00
5bf06aa258 release: bump to 0.1.0+2 and add promote_production fastlane lane
All checks were successful
ci / analyze (push) Successful in 1m9s
ci / test-commons-core (push) Successful in 38s
ci / test-app-seeds (push) Successful in 5m48s
2026-07-16 15:40:26 +02:00
61f54cc0db ci(forgejo): turn off format gate, fix locale-fragile settings test
All checks were successful
ci / analyze (push) Successful in 1m9s
ci / test-commons-core (push) Successful in 41s
ci / test-app-seeds (push) Successful in 5m52s
Format: repo predates Dart 3.11's tall formatter (~128 files would need a
dedicated reformat commit); disable --set-exit-if-changed for now, keep
flutter analyze as the real gate.

Test: 'drawer Settings opens the settings screen' asserted find.text('Español'),
which only holds when the resolved locale is Spanish. Under AppLocale.en (as
set in the test) the tile reads 'English', so it failed under CI's non-Spanish
host locale. Assert by the language selector's Key + icon instead (locale-robust).
2026-07-16 12:21:27 +02:00
b6eae28234 ci(forgejo): manual git checkout instead of actions/checkout@v4
Some checks failed
ci / analyze (push) Failing after 30s
ci / test-commons-core (push) Successful in 45s
ci / test-app-seeds (push) Failing after 6m2s
The cirruslabs/flutter job image has no Node.js, so JS-based actions fail with
'exec: node: not found'. Check out with plain git over the internal forgejo:3000
URL + job token, keeping the workflows Node-free.
2026-07-16 11:32:08 +02:00
4cac56e3bb docs(release): note Forgejo Actions runner is missing on aaron + keystore alias
Some checks failed
ci / analyze (push) Failing after 15s
ci / test-commons-core (push) Failing after 29s
ci / test-app-seeds (push) Failing after 3s
aaron runs forgejo + jenkins but no act_runner, so workflows queue until a runner
is registered (or CI moves to Jenkins). Record that the keystore alias is tane-upload.
2026-07-16 03:15:18 +02:00
15eb9f7007 ci: port analyze/test gate to Forgejo Actions, retire .gitlab-ci.yml
git.comunes.org is Forgejo. Replicates the analyze + commons_core/app_seeds test
gate in .forgejo/workflows/ci.yml (per-push + PR). Dropped the GitLab-only Windows
job (no Forgejo Windows runner).
2026-07-16 03:07:07 +02:00
17d0ff1221 fix(release): port store publishing to Forgejo Actions (canonical remote is Forgejo)
git.comunes.org runs Forgejo Actions, not GitLab CI, so the tag-triggered
signed-AAB build + fastlane Play upload now lives in .forgejo/workflows/release.yml
(single job, no cross-job artifact passing). Removed the equivalent GitLab jobs;
.gitlab-ci.yml keeps only the analyze/test gate. Play service account is reused
from Ğ1nkgo. docs/release.md updated (Forgejo secrets).
2026-07-16 03:05:33 +02:00
eef99975bf feat(store): branded feature graphic (1024x500) + 512 store icon
Noto Sans wordmark on brand green (#2F7D34), white sprout, and the official
value tagline ('keep and share traditional seeds' / 'guarda y comparte...').
Generated by tool/gen_feature_graphic.py for en-US and es-ES.
2026-07-16 02:49:06 +02:00
fd6b9d5f0d feat(release): automate store publishing (fastlane supply + GitLab CI) and F-Droid recipe
- fastlane: Appfile/Fastfile/Gemfile with deploy_play lane (AAB -> Play internal track)
- CI: tag-gated build:android (signed AAB/APK from CI secrets) + deploy:play jobs
- F-Droid: fdroiddata build recipe at docs/fdroid/org.comunes.tane.yml
- Play compliance: Data Safety / content-rating answer sheet (docs/legal/internal)
- docs/release.md: automated tag-triggered flow, dedicated tane-upload keystore
- pubspec: description now mentions the market, not just the inventory
2026-07-16 02:42:47 +02:00
dc0d18562f fix(quick-add): wrap sheet action row to prevent overflow on small screens
The Cancel / Save-and-add-another / Save actions were a fixed Row that
could not shrink, so on narrow phones and long locales (es/pt/de/fr) the
buttons overflowed the right edge (the clipped 'Guardar'). Replace it with
an OverflowBar that wraps onto stacked, end-aligned lines when they don't
fit; move the added-count onto its own line above.

Guard it in small_screen_overflow_test.dart across the long locales.
2026-07-16 00:34:42 +02:00
5b64fe14b3 docs: de-link spike findings from spike/ code (moved to private repo) 2026-07-15 20:27:45 +02:00
2d4dec5304 docs(i18n): correct site Weblate format to go-i18n-json-v2
The object-form go-i18n JSON ({"key":{"other":...}}) is parsed by Weblate's
go-i18n-json-v2 format, not go-i18n-json (which expects a top-level array).
2026-07-15 19:46:16 +02:00
7150e337eb i18n(site): convert Hugo i18n TOML->go-i18n JSON for Weblate
Weblate has no native Hugo-TOML format. The strings are already the go-i18n
structure ([key]/other=), so convert site/i18n/{en,es}.toml -> {en,es}.json
({"key":{"other":"..."}}) — Hugo 0.140 reads it identically (verified with the
pinned hugomods/hugo:exts-0.140.2 image). Enables a 'site' Weblate component.

Update TRANSLATIONS.md: site is now a component (go-i18n-json), not deferred.
2026-07-15 19:42:54 +02:00
7d5f26ff4a feat(links): surface source repo + Weblate links on site and in app
- site: set sourceURL (git.comunes.org/comunes/tane) and weblateURL
  (translate.comunes.org/projects/tane) — activates footer + collaborate links
- app About screen: add 'Source code' and 'Help translate' link tiles
- i18n: add about.sourceCode / about.translate / about.translateSubtitle
  (en base + es/pt/fr/de/ast; ja falls back to base), regenerate slang
- docs: add TRANSLATIONS.md runbook for the Weblate app component + git
  token + slang-regeneration workflow
2026-07-15 19:12:16 +02:00
991785821f feat(screenshots): localize sample variety & market names per shot language 2026-07-15 17:48:44 +02:00
ff7e7e120f docs(web): add deploy runbook for tane.comunes.org 2026-07-15 17:19:48 +02:00
59ee5221de chore(site): regenerate legal pages from docs masters (canonical wrapping) 2026-07-15 15:59:17 +02:00