{"id":21374834,"url":"https://github.com/banool/auslan_dictionary","last_synced_at":"2026-06-13T21:01:32.759Z","repository":{"id":38327980,"uuid":"293184523","full_name":"banool/auslan_dictionary","owner":"banool","description":"Code for the app, scripts, and site for Auslan Dictionary","archived":false,"fork":false,"pushed_at":"2026-06-11T10:32:27.000Z","size":93775,"stargazers_count":19,"open_issues_count":35,"forks_count":5,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-06-11T11:23:30.260Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://auslandictionary.org","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/banool.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-09-06T01:51:28.000Z","updated_at":"2026-06-11T10:22:31.000Z","dependencies_parsed_at":"2023-02-12T17:30:52.989Z","dependency_job_id":"a6ea2e23-f3b7-4c38-acc8-f9911bd5ec67","html_url":"https://github.com/banool/auslan_dictionary","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/banool/auslan_dictionary","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/banool%2Fauslan_dictionary","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/banool%2Fauslan_dictionary/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/banool%2Fauslan_dictionary/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/banool%2Fauslan_dictionary/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/banool","download_url":"https://codeload.github.com/banool/auslan_dictionary/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/banool%2Fauslan_dictionary/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34300116,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-13T02:00:06.617Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-22T08:45:42.409Z","updated_at":"2026-06-13T21:01:32.754Z","avatar_url":"https://github.com/banool.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Auslan Dictionary\n\nThis repo contains all the code for Auslan Dictionary, the free forever video dictionary and revision tool for Australian sign language.\n\nAs of 2025-01-05 the app has been downloaded 372,975 times:\n- Apple: 351k (based on First-Time Downloads)\n  - Desktop / Laptop: 71%\n  - iPhone: 26%\n  - iPad: 3%\n- Android: 21.8k\n\nNote that 67% of downloads on Apple are [institutional](https://apple.stackexchange.com/a/428958), likely implying use by educational institutions. Ignoring those, there have been 103k unique downloads.\n\n## Deploying to Android\nThis is done automatically via Github Actions.\n\n## Deploying to iOS\nCurrently this must be done manually. Make sure `ios/publish.env` is configured (see below), then run:\n```\nflutter pub get\nflutter pub run flutter_launcher_icons:main\nflutter pub run flutter_native_splash:create\n./ios/publish.sh\n```\n\n`ios/publish.sh` is fully hands-off: it verifies the API key, clears any revoked/expired certs and stale provisioning profiles, then builds with `xcodebuild` using **automatic** signing and uploads to TestFlight via `xcrun altool`. With an Admin API key, automatic signing creates and manages the distribution certificate and the App Store provisioning profile (including the Sign In with Apple + Associated Domains entitlements) — no fastlane, match, Xcode GUI, or manual cert management.\n\n### App Store Connect API key (`ios/publish.env`)\n`ios/publish.env` (git-ignored) must export:\n```\nexport TEAM_ID='...'                              # Apple Developer team id (e.g. 9N3SNHTGL7)\nexport APP_STORE_CONNECT_API_ISSUER_ID='...'      # Issuer ID (top of the API keys page)\nexport API_KEY_PATH='/path/to/AuthKey_XXXX.p8'    # the private key file you downloaded\nexport APP_STORE_CONNECT_API_KEY_ID='XXXX'        # optional — see note\n```\nGet these at App Store Connect → **Users and Access → Integrations → App Store Connect API**:\n- The key **must have the Admin role** — a lesser role (e.g. App Manager) can upload builds but cannot create signing certificates, which makes the export fail.\n- **Key ID:** the `.p8` does *not* contain its ID; Apple only encodes it in the download filename `AuthKey_\u003cKEYID\u003e.p8`. So if you keep that filename, `publish.sh` derives the ID automatically and you can omit `APP_STORE_CONNECT_API_KEY_ID`. If you rename the file, set `APP_STORE_CONNECT_API_KEY_ID` to the key's ID. (The `.p8` can only be downloaded once — keep it safe.)\n\n### Troubleshooting\nThe script runs a fast auth precheck before building, so credential problems fail in seconds rather than after a full archive:\n- **HTTP 401** — the key ID, issuer ID, and `.p8` don't all match. Confirm the Key ID matches the `.p8` (the `AuthKey_\u003cID\u003e.p8` name) and the Issuer ID is the one on the API keys page.\n- **HTTP 403** — the key authenticates but isn't Admin. Create an Admin key.\n- **`exportArchive Signing certificate is invalid`** — a revoked/expired cert was selected. The script clears these automatically; if it recurs, a cert was revoked *during* the run, which almost always means signing was toggled in Xcode — don't do that, just run the script. (Apple auto-revokes the oldest distribution cert when you exceed the limit, so keep the number of distribution certs small in the portal.)\n\nTry installing cocoapods with brew instead of gem: https://github.com/flutter/flutter/issues/157694.\n\n## Screenshots\nFirst, make sure you've implemented the fix in https://github.com/flutter/flutter/issues/91668 if the issue is still active. In short, make the following change to `~/homebrew/Caskroom/flutter/2.10.3/flutter/packages/integration_test/ios/Classes/IntegrationTestPlugin.m`:\n```\n+ (void)registerWithRegistrar:(NSObject\u003cFlutterPluginRegistrar\u003e *)registrar {\n    [[IntegrationTestPlugin instance] setupChannels:registrar.messenger];\n}\n```\n\nYou may also need to `flutter clean` after this.\n\nThen run this:\n```\npython3 screenshots/take_screenshots.py\n```\n\nThis takes screenshots for both platforms on multiple devices. Upload them to both stores with:\n```\npython3 screenshots/upload_screenshots.py\n```\n\nThis drives the App Store Connect and Google Play APIs directly (no fastlane) and supports `--ios-only`, `--android-only`, and `--dry-run`. The stores cap a listing at 10 (App Store) and 8 (Play) screenshots while the harness captures more than that, so the ordered selection lists at the top of the script choose which captures are published and in what order — edit them there to re-curate the storefronts.\n\nCredentials:\n- **App Store Connect:** the same `ios/publish.env` that `ios/publish.sh` uses. Screenshots attach to an *editable* app version, so create the new version in App Store Connect first if one isn't already in Prepare for Submission.\n- **Google Play:** a service account JSON key at `android/play_service_account.json` (git-ignored), or set `PLAY_SERVICE_ACCOUNT_JSON_PATH`. Use a key for the same service account CI publishes builds with (the `ANDROID_SERVICE_ACCOUNT_JSON` secret); it needs permission to edit the store listing in the Play Console. All Play changes happen inside a single edit that is committed only at the end, so a failed run changes nothing.\n\n## General dev guide\n\nInstall the git hooks once after cloning — the pre-commit hook checks formatting and bumps the build number:\n```sh\ngit config core.hooksPath .githooks\n```\n\n### Formatting\n\nAll Dart is formatted with `dart format`. The pre-commit hook blocks unformatted commits, CI (`.github/workflows/ci.yaml` → the `format` job) runs `dart format --output=none --set-exit-if-changed lib test integration_test test_driver`, and `.zed/settings.json` keeps Zed's format-on-save in step. Format everything with `dart format lib test integration_test test_driver`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbanool%2Fauslan_dictionary","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbanool%2Fauslan_dictionary","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbanool%2Fauslan_dictionary/lists"}