Thanks for taking the time to look at KiCk. This guide covers the local setup, day-to-day workflow, and the release pipeline.
KiCk is a Flutter app that ships a local OpenAI-compatible proxy. Source lives in lib/:
| Path | What it contains |
|---|---|
lib/main.dart |
App entry point. |
lib/app/ |
Bootstrap, routing, and metadata. |
lib/proxy/ |
Proxy isolate, OpenAI parser/mapper, account pool, Gemini and Kiro clients. |
lib/features/ |
UI screens (home, accounts, settings, logs, app shell). |
lib/data/ |
Drift database, repositories, and serializable models. |
lib/core/ |
Shared logging, networking, security, theming. |
lib/l10n/ |
ARB source files and generated localizations. |
lib/analytics/ and lib/observability/ |
Aptabase and GlitchTip / Sentry integrations. |
Build configs and release tooling live in:
android/,linux/,windows/- platform projects.installer/- Inno Setup script, nfpm config, Linux desktop and metainfo, AURPKGBUILD.manifests/- WinGet manifests.scripts/- build and publishing scripts referenced by CI..github/workflows/- CI, release, version-tag, l10n, and Kiro IDE version sync.
- Flutter SDK matching the version pinned in
.github/workflows/ci.yml(FLUTTER_VERSION). - Platform tooling for the targets you build:
- Android: Android Studio with the latest SDK and a working JDK 17.
- Windows: Visual Studio with the "Desktop development with C++" workload.
- Linux: build dependencies listed under Linux packages.
flutter pub get
flutter gen-l10nflutter gen-l10n generates files into lib/l10n/generated/. CI verifies that those files are committed, so always rerun the command after touching any lib/l10n/*.arb file or l10n.yaml.
Run the app on your platform of choice:
flutter run -d windowsflutter run -d linuxflutter run -d androidBefore opening a PR run the same checks CI does:
flutter analyze
flutter test --exclude-tags=golden
flutter test --tags=goldenNotes:
- Lints come from
analysis_options.yaml. Highlights:strict-casts,strict-inference,require_trailing_commas,unawaited_futures. - Golden tests live behind the
goldentag (seedart_test.yaml). On Linux the goldens are skipped because they are recorded on Windows; thegoldens-windowsjob in CI is the source of truth. - Use the PR template in
.github/pull_request_template.mdand tick the platforms you actually verified manually.
- Source locale is
en(lib/l10n/app_en.arb). - Add or update keys in
app_en.arbfirst, then updateapp_<locale>.arbfor every other locale. - Run
flutter gen-l10nand commitlib/l10n/generated/. - The
Sync Generated Localizationsworkflow regenerates outputs automatically on push, but committing them locally avoids a separate CI commit. - Full workflow and translation rules: LOCALIZATION.md.
- The single source of truth is
version:inpubspec.yaml. - When
version:changes onmain, theSync Version Tagworkflow creates avX.Y.Ztag. - Pushing that tag triggers
Release, which builds and publishes:- Windows portable zip and installer
- Linux
tar.gz, AppImage,.deb,.rpm,.pkg.tar.zst - Android APK and AAB
- After the GitHub release is published, follow-up jobs:
- Publish APT, RPM, and Pacman repository metadata to GitHub Pages.
- Update the
kick-binAUR package. - Submit the WinGet manifest to
microsoft/winget-pkgs.
Android signing:
KICK_ANDROID_KEYSTORE_BASE64KICK_ANDROID_KEYSTORE_PASSWORDKICK_ANDROID_KEY_ALIASKICK_ANDROID_KEY_PASSWORD
Release signing:
KICK_RELEASE_GPG_PRIVATE_KEYKICK_RELEASE_GPG_PASSPHRASEKICK_RELEASE_GPG_KEY_ID
The release workflow signs the SHA-256 checksum file and the Linux repository metadata with this key. Per-package Linux signatures and Windows Authenticode signing are intentionally out of scope.
Publishing:
AUR_SSH_PRIVATE_KEY- SSH key authorized to push to thekick-binAUR repository.WINGET_PAT- GitHub PAT accepted bywingetcreatefor opening pull requests inmicrosoft/winget-pkgs.
Optional analytics and diagnostics:
KICK_APTABASE_APP_KEY_RELEASEKICK_APTABASE_HOST_RELEASESENTRY_DSNSENTRY_AUTH_TOKENKICK_GLITCHTIP_TRACES_SAMPLE_RATE
Optional repository variables:
AUR_GIT_NAMEAUR_GIT_EMAIL
Inno Setup 6 is required.
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\build-windows-installer.ps1The script runs flutter build windows --release (skip with -SkipBuild if you already built it) and produces both the installer and a portable zip in build\dist.
Install Flutter Linux build dependencies plus packaging tooling:
sudo apt install \
clang lld cmake ninja-build pkg-config \
openjdk-17-jdk libgtk-3-dev liblzma-dev \
libcurl4-openssl-dev libsecret-1-dev libjsoncpp-dev \
libayatana-appindicator3-dev libnotify-devInstall nfpm and appimagetool, then run:
scripts/build-linux-packages.sh --version "$(grep '^version:' pubspec.yaml | sed 's/version: *//; s/+.*//')"The script writes artifacts to build/dist/linux:
kick-linux-x64-VERSION.tar.gzkick-linux-x64-VERSION.AppImagekick-linux-x64-VERSION.debkick-linux-x64-VERSION.rpmkick-linux-x64-VERSION.pkg.tar.zst
To regenerate GitHub Pages repository metadata locally after importing the release GPG key:
scripts/publish-linux-repos.sh \
--artifact-dir build/dist/linux \
--pages-dir build/pages \
--version VERSION \
--gpg-key-id KEY_IDTo refresh the AUR PKGBUILD and .SRCINFO from a built release archive:
git clone ssh://aur@aur.archlinux.org/kick-bin.git build/aur/kick-bin
scripts/update-aur-package.sh \
--aur-dir build/aur/kick-bin \
--artifact-dir build/dist/linux \
--version VERSION \
--repository mxnix/kickflutter_secure_storageuseslibsecret. End users need a working keyring such as GNOME Keyring or KWallet.- Tray icons use AppIndicator. GNOME users may need the AppIndicator extension.
- The app downloads and verifies update packages but does not invoke
sudo,dpkg,rpm, orpacmanautomatically.
The release workflow generates and submits the WinGet manifest after the GitHub release is published. For a first manual submission or local validation:
winget validate --manifest .\manifests\n\nikzmx\KiCk\VERSION --disable-interactivity
wingetcreate submit --prtitle "Add nikzmx.KiCk version VERSION" .\manifests\n\nikzmx\KiCk\VERSION