Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 15 additions & 37 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -1,90 +1,68 @@
name: Bug report
description: Report a reproducible launcher, installer, or runtime problem.
description: Report a reproducible TFTMAC native-app or runtime problem.
title: "[Bug]: "
labels: [bug]
body:
- type: markdown
attributes:
value: Thanks for helping improve Mactician. Remove account names and other personal data from logs before attaching them.
value: Thanks for helping improve TFTMAC. Remove account names, credentials, tokens, and other private data before attaching logs.
- type: input
id: launcher-version
id: build
attributes:
label: Mactician version and build
placeholder: 1.0.0 (33)
label: TFTMAC commit or build
placeholder: commit SHA or build identifier
validations:
required: true
- type: input
id: macos-version
attributes:
label: macOS version
placeholder: 15.6.1
validations:
required: true
- type: input
id: mac-model
attributes:
label: Mac model and Apple chip
placeholder: MacBook Pro, Apple M3 Pro
validations:
required: true
- type: dropdown
id: installation-state
attributes:
label: Installation state
options:
- Fresh installation
- Updated installation
- Existing installation
validations:
required: true
- type: input
id: resolution
attributes:
label: Selected resolution
placeholder: 1920×1080
placeholder: Mac mini, Apple M4
validations:
required: true
- type: input
id: resources
id: runtime
attributes:
label: Selected RAM and vCPU
placeholder: 6144 MB RAM, 6 vCPU
validations:
required: true
label: Android Emulator version
placeholder: 37.1.11
- type: textarea
id: expected
attributes:
label: Expected behavior
description: What did you expect to happen?
validations:
required: true
- type: textarea
id: actual
attributes:
label: Actual behavior
description: What happened instead?
validations:
required: true
- type: textarea
id: steps
attributes:
label: Reproduction steps
placeholder: |
1. Open ...
2. Select ...
3. Observe ...
1. Open TFTMAC
2. Perform the action
3. Observe the result
validations:
required: true
- type: textarea
id: logs
attributes:
label: Sanitized logs
description: Paste relevant log excerpts. Remove Riot account names, filesystem usernames, tokens, and other private data.
label: Sanitized diagnostics
description: Include only the bounded excerpt needed to show the failure.
render: shell
- type: checkboxes
id: privacy
attributes:
label: Privacy confirmation
options:
- label: I removed credentials, account identifiers, and raw sensitive logs from this report.
- label: I removed credentials, account identifiers, tokens, and raw sensitive data.
required: true
29 changes: 10 additions & 19 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -1,27 +1,18 @@
## Summary

Describe the problem, the change, and its scope.

## Motivation

Explain why this change is needed and why this scope is appropriate.
Describe the problem, the change, and its exact scope.

## Validation

- [ ] `./scripts/verify-repository.command`
- [ ] `./scripts/test-mactician.command`
- [ ] Relevant manual or integration checks are described below, or are not applicable.

## Screenshots

Attach before/after screenshots for UI changes, or write “Not applicable.”
- [ ] `/bin/zsh scripts/verify-tftmac.command`
- [ ] Relevant runtime/manual acceptance is described below or is not applicable.

## Contributor checklist

- [ ] I did not add game APKs, Android images, private runtime state, credentials, logs, or generated build products.
- [ ] Developer-facing output and documentation are in English.
- [ ] New machine paths are resolved from environment variables, standard locations, or `PATH`.
- [ ] Behavior changes include tests or a concrete reason why a test is impractical.
- [ ] Performance claims include reproducible evidence and avoid overstating noisy results.
- [ ] Documentation, changelog, and release notes are updated when applicable.
- [ ] Existing rollback, Repair, Reset, and fail-closed behavior is preserved or the deliberate change is explained.
- [ ] I did not add Riot APKs, Android images, credentials, private runtime state, tokens, logs, or generated build products.
- [ ] The stock Google Android Emulator remains the normal runtime authority.
- [ ] The change does not add a private game feed, APK repackaging, re-signing, or Riot binary patching.
- [ ] Behavior changes include tests or a concrete reason a test is impractical.
- [ ] Performance claims include reproducible evidence.
- [ ] Documentation is updated when behavior or commands change.
- [ ] Rollback and fail-closed behavior is preserved or the deliberate change is explained.
17 changes: 7 additions & 10 deletions .github/repository-metadata.yml
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
description: A native, open-source macOS launcher for playing TFT PBE on Apple Silicon.
homepage: https://sergeinaumov.dev/mactician
social_preview: branding/generated/mactician-social-preview.png
description: Native macOS control and presentation app for the official Android Teamfight Tactics client on Apple Silicon.
topics:
- mactician
- tftmac
- macos
- swift
- swiftui
- appkit
- metal
- apple-silicon
- tft
- tft-pbe
- teamfight-tactics
- android-emulator
- vulkan
- moltenvk
- open-source
- google-play
- emulator-controller
22 changes: 12 additions & 10 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,35 @@ name: CI

on:
push:
branches: [main]
branches: [master]
pull_request:

permissions:
contents: read

jobs:
validate:
name: Validate and test
name: Validate TFTMAC
runs-on: macos-latest
timeout-minutes: 30
timeout-minutes: 45
steps:
- name: Check out repository
uses: actions/checkout@v4
uses: actions/checkout@v7.0.1

- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: '24'

- name: Install validation tools
run: |
command -v jq >/dev/null || brew install jq
command -v rg >/dev/null || brew install ripgrep

- name: Validate repository policy and metadata
run: ./scripts/verify-repository.command

- name: Run launcher unit tests and production typecheck
run: ./scripts/test-mactician.command
- name: Validate TFTMAC source, unsigned Release build, and native tests
run: /bin/zsh scripts/verify-tftmac.command

- name: Reject whitespace and generated changes
- name: Reject whitespace and generated drift
run: |
git diff --check
test -z "$(git status --short)"
84 changes: 30 additions & 54 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,62 +1,38 @@
# Changelog

The current application metadata is version 1.0.4, build 40.

## Unreleased

No changes yet.

## 1.0.4 — 2026-08-14

### Fixed

- Restore four asynchronous OpenGL PSO compiler services when a TFT update
disables them in its inherited Android device profile, avoiding first-use
shader compilation stalls on the gameplay render path.

## 1.0.3 — 2026-08-14

### Changed

- Check the signed TFT PBE feed when the launcher becomes ready.
- Show **Update game** in place of **Play** only when a newer verified game
version is available.
- Prevent starting a known-outdated game build until its update completes.

## 1.0.2 — 2026-08-13

### Fixed

- Check for Mactician updates on every launch instead of waiting only for the
daily Sparkle schedule.
- Show an explicit localized result after a game update check, including the
installed TFT PBE version when no newer hosted build is available.
- Record completed game update checks in the launcher log.

## 1.0.1 — 2026-08-13

### Added

- Added a separately signed TFT PBE update channel hosted on
`sergeinaumov.dev`.
- Added in-place split APK updates that preserve Riot sign-in and local game
data.

## 1.0.0 — 2026-08-10

### Added
### Documentation

- Initial public version of Mactician.
- Reconciled current Build 8 runtime, automatic-logging, and graphics-causality
status across the human-readable project record.
- Recorded the latest 42m27s automatic graphics capture as performance evidence
while retaining internal attribution as unknown.
- Archived obsolete launch/profile/source-build entrypoints under
`docs/history/2026-08-31-pre-build8/` and replaced them with current pointers.

### Changed

- Restyled the active game Dock icon as a distinct Mactician play variant and
replaced the Android Emulator title with `Mactician: TFT PBE`.
- Reduced Trial benchmark preparation from roughly 20 seconds to 1–3 seconds
by overlapping one shop decision with combat and batching reward, XP, item,
and replay actions.
- Preserved valid measurements across same-emulator Trial retries, added a
bounded same-combat capture retry, and repaired early-exit cleanup after a
launcher crash.
- Updated Performance Max with the confirmed 67% effects/LOD profile and a
16 KiB ASG write step; repeated Trial 1-8 proxies remained above 30 FPS.
- Split repository/CI verification from the local-only installed-runtime and
signing audit; CI no longer depends on `/Applications`, an external runtime,
a private signing identity, credentials, or captures.
- Updated GitHub checkout to `actions/checkout@v7.0.1` while retaining Node 24.
- Reconciled machine-readable runtime, retained-evidence, engineering-map, and
performance-lab authority around stock Build 8 and the planned isolated
causal logger.
- Separated historical Build 8 signing acceptance from the current-host
`CSSMERR_TP_NOT_TRUSTED` audit and its missing login-keychain identity.
- Established TFTMAC as the sole product and repository identity.
- Replaced legacy validation with the native TFTMAC build/test verifier.
- Preserved the proven native AppKit/Metal Gate 1 implementation and frozen installed EmulatorController protocol.
- Removed obsolete launcher, hosted update/feed, helper-host, and branding layers.
- Moved runtime authority to the stock Google Android Emulator and official Google Play TFT lifecycle.
- Began relational migration of retained performance evidence to TFTMAC-owned identifiers.
- Retired source-built emulator work from the normal product path.

### Current target

- Native macOS application bundle: `com.flashls1.tftmac`.
- Stock Android Emulator 37.1.11.
- Official Google Play package `com.riotgames.league.teamfighttactics`.
- 1920x1080 / 60 Hz target on Apple Silicon.
50 changes: 14 additions & 36 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,48 +1,26 @@
# Contributing

Contributions are welcome when they are narrowly scoped, testable, and preserve
the launcher's recovery guarantees.
Keep TFTMAC changes narrow, testable, and aligned with the current stock-runtime architecture.

## Development setup

Use an Apple Silicon Mac with macOS 12 or later, Xcode Command Line Tools, zsh,
`jq`, Node.js for the optional login helper, and the local private APK build
inputs described in [docs/building.md](docs/building.md). Runtime and game data
must remain outside Git.
Use an Apple Silicon Mac with macOS 15 or later, Xcode 26.6, zsh, Node.js 24, `jq`, and `ripgrep`. Runtime and game data must remain outside Git.

Run the fast validation before opening a pull request:
Run before opening a pull request:

```sh
./scripts/verify-repository.command
./scripts/test-mactician.command
/bin/zsh scripts/verify-tftmac.command
```

The provisioning integration test downloads large pinned Android archives and
is intentionally local/manual:
## Rules

```sh
./scripts/integration-test-mactician.command
```
- Preserve `com.flashls1.tftmac` as the application identity.
- Preserve the stock Google Android Emulator as runtime authority unless a separately approved measured blocker requires a different architecture.
- Do not add Riot APKs, credentials, Android userdata, tokens, runtime disks, or private session data to the repository.
- Do not add hosted game feeds, APK repacking, re-signing, or binary patching.
- Keep generated build output out of Git.
- Update tests and documentation when behavior changes.
- Keep performance claims tied to reproducible captures and explicit KEEP/REJECT evidence.
- Preserve rollback and fail-closed behavior around runtime mutation.

## Pull requests

- Keep changes small and explain their motivation and failure mode.
- Update documentation whenever commands, manifests, behavior, or recovery
steps change.
- Preserve transactional rollback, checksum verification, and fail-closed
behavior around unknown UI states and unsupported game versions.
- Do not weaken update signing, bundle identity, appcast trust, or manifest
validation.
- Add benchmark claims only with reproducible, same-scene evidence and recorded
hashes. Label single runs provisional.
- Keep shell scripts compatible with zsh, derive the project root from
`${0:A:h}`, quote paths, validate required tools, and emit English output.
- Keep the Mactician interface localized in English and Russian, update both
`.strings` files for user-visible changes, and never translate the brand name.
Game-language support is independent.
- Do not commit secrets, credentials, APKs, runtime state, AVD userdata, logs,
crash dumps, build output, or developer-specific absolute paths.

Use the pull request template and include screenshots for UI changes. A change
that affects install, Repair, Reset, launch, stop, or update behavior must state
how rollback and recovery were verified.
UI work should include appropriate validation evidence. Runtime work should state the exact owning boundary and failure mode it changes.
Loading
Loading