Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
90f94cb
DTC PDF generation working
bwsinger Jan 27, 2026
d0ceac0
Add DriveThruCards order automation flow
bwsinger Jan 28, 2026
615bcc2
Merge branch 'chilli-axe:master' into drivethrucards
bwsinger Jan 30, 2026
316081e
Strip XMP metadata from images before saving
bwsinger Jan 30, 2026
9967950
Add claude.md to gitignore
bwsinger Jan 30, 2026
2716782
Use undetected-chromedriver for Cloudflare bypass
bwsinger Feb 2, 2026
77e5b27
Add dynamic Chrome version detection for undetected-chromedriver
bwsinger Feb 2, 2026
e00a26f
Add setuptools dependency for Python 3.13 compatibility
bwsinger Feb 2, 2026
20b4188
Add stealth measures for DriveThruCards login (MVP)
bwsinger Feb 2, 2026
3d532e7
Fix slow login after Cloudflare CAPTCHA by disabling implicit wait du…
bwsinger Feb 2, 2026
752a3eb
Remove unused login workaround methods
bwsinger Feb 2, 2026
832c15d
Add consistent order ending message
bwsinger Feb 6, 2026
d27f9eb
Fix continue button click after PDF upload by polling for activation
bwsinger Feb 6, 2026
fb2b016
Navigate directly to buy_now URL instead of clicking target=_blank link
bwsinger Feb 6, 2026
f52ef68
Navigate to upload page in same tab instead of opening new window
bwsinger Feb 6, 2026
2eb06fc
Fix PDF exports to reload updated card images
bwsinger Feb 9, 2026
f795e5c
Add skip-pdf-if-exists with stale cards prompt
bwsinger Feb 9, 2026
7b043f4
Add Chromium profile options for DriveThruCards automation
bwsinger Feb 9, 2026
27aa8cc
Add CLI mode to download images without uploading
bwsinger Feb 9, 2026
b31c505
Log PDF/X conversion progress during DTC exports
bwsinger Feb 9, 2026
0df32ad
Bundle desktop-tool assets in Nuitka builds
bwsinger Feb 9, 2026
3136fb6
Add PR-ready Desktop Tool wiki draft in repo
bwsinger Feb 9, 2026
a4d18da
Add unit tests for DriveThruCards-specific driver flow
bwsinger Feb 9, 2026
55fb476
Make DTC custom stealth opt-in and test default behavior
bwsinger Feb 9, 2026
09c8a44
Fail fast on DTC login timeout and add platform installer tests
bwsinger Feb 9, 2026
f0f91aa
Refactor DTC flow into guarded steps with clearer failures
bwsinger Feb 9, 2026
880c696
Add explicit DTC Ghostscript install confirmation prompt
bwsinger Feb 9, 2026
1038508
Reduce default DTC step logs and remove post-login navigation delay
bwsinger Feb 9, 2026
cb80f69
Clarify help text for new CLI flags and stealth usage
bwsinger Feb 9, 2026
5cfd974
Update wiki draft with new flag guidance and logging notes
bwsinger Feb 9, 2026
010d73a
Simplify boolean flags and streamline wiki addendum docs
bwsinger Feb 9, 2026
159f1fe
Place DriveThruCards last in site picker choices
bwsinger Feb 9, 2026
294f215
Ignore build files and AI help files
bwsinger Feb 9, 2026
b1f79ff
Merge remote-tracking branch 'upstream/master' into codex/drivethruca…
bwsinger Mar 13, 2026
9044d8d
Honor DriveThruCards PDF export mode
bwsinger Mar 13, 2026
7e09814
Write PDF/X output atomically
bwsinger Mar 13, 2026
e090e9a
Retry DriveThruCards driver startup
bwsinger Mar 13, 2026
b3644d5
Keep browser open for user handoff
bwsinger Mar 13, 2026
0effb03
Fix DriveThruCards login modal navigation
bwsinger Jun 8, 2026
d8589d1
Merge remote-tracking branch 'upstream/master' into drivethrucards
bwsinger Jul 16, 2026
a2b4ad2
Automate DriveThruCards publisher onboarding
bwsinger Jul 17, 2026
6bc18b6
Add DriveThruCards sign-in guidance
bwsinger Jul 17, 2026
bd97c9d
Document DriveThruCards publisher workflow
bwsinger Jul 17, 2026
2d5b042
Stop tracking desktop tool TODO
bwsinger Jul 17, 2026
db9bfc6
Skip secret-backed desktop tests on fork PRs
bwsinger Jul 17, 2026
fc4d300
Merge remote-tracking branch 'upstream/master' into drivethrucards
bwsinger Jul 19, 2026
e60984e
Scope undetected-chromedriver to DriveThruCards only
bwsinger Jul 19, 2026
279afb1
Fail loudly when required DriveThruCards order steps break
bwsinger Jul 19, 2026
625bacc
Generate genuine PDF/X-1a output and verify it before reporting success
bwsinger Jul 19, 2026
71551e5
Locate or download the SWOP ICC profile instead of bundling Adobe's
bwsinger Jul 19, 2026
5c0f270
Collapse Ghostscript setup to one consent-gated install prompt
bwsinger Jul 19, 2026
70b1db2
Remove dead code
bwsinger Jul 19, 2026
d703bcf
Simplify DTC helpers and fix multi-order edge cases
bwsinger Jul 19, 2026
f822aa1
Match repo style conventions
bwsinger Jul 19, 2026
1a0327a
PR hygiene: CI, assets and repo files
bwsinger Jul 19, 2026
f4561aa
Apply black formatting and restore browser factory type-ignore
bwsinger Jul 19, 2026
91436fd
Remove dead local-file post-processing branch from download_image
bwsinger Jul 19, 2026
3b75afe
Process and embed each unique image once per DTC PDF export
bwsinger Jul 19, 2026
4c9e7a1
Ignore per-platform CI build artifact names
bwsinger Jul 19, 2026
783a36f
Remove assets README
bwsinger Jul 19, 2026
92f37c6
Redesign DTC post-launch page as a step timeline in DTC colours
bwsinger Jul 19, 2026
ee43ccc
Fix and validate Windows desktop builds
bwsinger Jul 21, 2026
789092e
Validate macOS and Linux desktop builds
bwsinger Jul 22, 2026
234eb21
Run Linux desktop checks with D-Bus
bwsinger Jul 22, 2026
ac7fdcb
feat(desktop-tool): improve startup UX and reliability
bwsinger Jul 22, 2026
3dad8b2
chore(desktop-tool): review cleanup for DTC UX changes
bwsinger Jul 22, 2026
cb4a46d
Gate credential-dependent tests behind the Google Drive skipif marker
bwsinger Jul 22, 2026
848a03a
Declutter progress bars across DTC export and browser phases
bwsinger Jul 22, 2026
4c5fe1e
Hide tracebacks from the console and gate uploads on download success…
bwsinger Jul 22, 2026
baf2b4b
Version the onefile extraction cache to survive binary upgrades on macOS
bwsinger Jul 22, 2026
cb44a04
Keep per-image download errors out of the console
bwsinger Jul 22, 2026
42cee05
Clear progress bars when their phase ends and link to the mpcfill.com…
bwsinger Jul 22, 2026
1038c53
Gate the single-cardback complete run behind Google Drive credentials
bwsinger Jul 22, 2026
1af1675
Add Windows to the dispatchable desktop tool build workflow
bwsinger Jul 23, 2026
00f945f
Run the credentials check step under bash on Windows
bwsinger Jul 23, 2026
c9190ff
Fix DTC browser version detection
bwsinger Jul 23, 2026
a6ec4ad
Document DriveThruCards desktop workflow
bwsinger Jul 25, 2026
ed0da9c
Document fork CI credential behavior
bwsinger Jul 25, 2026
9a04f50
Use pinned Ghostscript installer on Windows
bwsinger Jul 30, 2026
833ca40
Parameterize desktop release version
bwsinger Jul 30, 2026
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
15 changes: 12 additions & 3 deletions .github/actions/test-desktop-tool/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@ name: Desktop tool tests
description: Test the MPC Autofill CLI / desktop tool
inputs:
google-drive-api-key:
description: Your Google Drive API key, required for running the database crawler
required: true
description: Your Google Drive API key. When empty, tests requiring it skip themselves.
required: false
default: ""
runs:
using: composite
steps:
Expand All @@ -30,12 +31,20 @@ runs:
pip install -r requirements.txt
shell: bash
- name: Write Google Drive API credentials to file
if: inputs.google-drive-api-key != ''
uses: jsdaniell/create-json@v1.2.3
with:
name: "client_secrets.json"
json: ${{ inputs.google-drive-api-key }}
dir: "desktop-tool/"
- name: Run tests
working-directory: desktop-tool
run: pytest .
env:
MPC_AUTOFILL_RELEASE_CHECKS: "1"
run: |
if [[ "$RUNNER_OS" == Linux ]]; then
dbus-run-session -- pytest .
else
pytest .
fi
shell: bash
101 changes: 101 additions & 0 deletions .github/workflows/build-desktop-tool.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
name: Desktop tool build

on:
workflow_dispatch:
inputs:
version:
description: Release version embedded in the executable (for example, 1.1.0)
required: true
type: string

jobs:
test:
name: Test on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
os:
- macos-latest
- ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: ./.github/actions/test-desktop-tool
with:
google-drive-api-key: ${{ secrets.GOOGLE_DRIVE_API_KEY }}

build:
name: Build ${{ matrix.target }}
needs: test
runs-on: ${{ matrix.os }}
defaults:
run:
working-directory: desktop-tool
strategy:
matrix:
include:
- os: macos-latest
target: macos-arm
filename: autofill-macos-arm.command
macos-arch: arm64
- os: macos-15-intel
target: macos-intel
filename: autofill-macos-intel.command
macos-arch: x86_64
- os: ubuntu-latest
target: linux
filename: autofill-linux.bin
macos-arch: ""
- os: windows-latest
target: windows
filename: autofill-windows.exe
macos-arch: ""
steps:
- uses: actions/checkout@v6
- name: Set up Python 3.13
uses: actions/setup-python@v6
with:
python-version: "3.13"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
python -m pip install imageio
- name: Require Google Drive API credentials
env:
GOOGLE_DRIVE_API_KEY: ${{ secrets.GOOGLE_DRIVE_API_KEY }}
shell: bash
run: test -n "$GOOGLE_DRIVE_API_KEY" || (echo "Add desktop-tool/client_secrets.json as the GOOGLE_DRIVE_API_KEY repository secret." && exit 1)
- name: Write Google Drive API credentials to file
uses: jsdaniell/create-json@v1.2.3
with:
name: client_secrets.json
json: ${{ secrets.GOOGLE_DRIVE_API_KEY }}
dir: desktop-tool/
- name: Build with Nuitka
uses: Nuitka/Nuitka-Action@main
with:
nuitka-version: main
working-directory: desktop-tool
script-name: autofill.py
mode: onefile
output-file: ${{ matrix.filename }}
# required by the versioned onefile cache directory ({VERSION} in --onefile-tempdir-spec)
file-version: ${{ inputs.version }}
macos-target-arch: ${{ matrix.macos-arch }}
- name: Smoke test bundled executable
shell: bash
run: |
env -u SSL_CERT_FILE -u SSL_CERT_DIR ./build/${{ matrix.filename }} --check-tls
if [[ "$RUNNER_OS" == Linux ]]; then
help_output=$(dbus-run-session -- ./build/${{ matrix.filename }} --help)
else
help_output=$(./build/${{ matrix.filename }} --help)
fi
grep -q MakePlayingCards <<< "$help_output"
grep -q DriveThruCards <<< "$help_output"
stat -f "%N: %z bytes" build/${{ matrix.filename }} 2>/dev/null || stat -c "%n: %s bytes" build/${{ matrix.filename }}
- name: Upload unsigned artifact
uses: actions/upload-artifact@v7
with:
name: ${{ matrix.target }} Unsigned Build
path: desktop-tool/build/${{ matrix.filename }}
5 changes: 5 additions & 0 deletions .github/workflows/desktop-tool-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -114,12 +114,17 @@ jobs:
script-name: autofill.py
mode: onefile
output-file: ${{ matrix.FILENAME }}
# required by the versioned onefile cache directory ({VERSION} in --onefile-tempdir-spec)
file-version: 1.0.${{ github.run_number }}
macos-sign-notarization: ${{ (matrix.TARGET == 'macos-arm') || (matrix.TARGET == 'macos-intel') }}
macos-sign-identity: ${{ secrets.MACOS_SIGN_IDENTITY }}
macos-sign-keyring-filename: "${{ runner.temp }}/app-signing.keychain-db"
macos-sign-keyring-password: ${{ secrets.KEYCHAIN_PASSWORD }}
macos-signed-app-name: com.ndepaola.mpc-autofill-${{ matrix.TARGET }}
macos-target-arch: ${{ matrix.MACOS_ARCH }}
- name: Smoke test bundled TLS
shell: bash
run: env -u SSL_CERT_FILE -u SSL_CERT_DIR ./build/${{ matrix.FILENAME }} --check-tls
- name: Upload unsigned artifact
id: upload-unsigned-artifact
uses: actions/upload-artifact@v7
Expand Down
12 changes: 10 additions & 2 deletions .github/workflows/test-desktop-tool.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ jobs:
test:
name: Desktop tool tests
runs-on: ${{ matrix.os }}
env:
GOOGLE_DRIVE_API_KEY: ${{ secrets.GOOGLE_DRIVE_API_KEY }}
strategy:
matrix:
include:
Expand All @@ -16,6 +18,12 @@ jobs:
# - os: ubuntu-latest # https://github.com/browser-actions/setup-edge/issues/516
steps:
- uses: actions/checkout@v6
- uses: ./.github/actions/test-desktop-tool
# Tests requiring the Google Drive API key skip themselves when it's absent (fork pull
# requests), so the rest of the suite still runs.
- name: Run desktop tool tests
uses: ./.github/actions/test-desktop-tool
with:
google-drive-api-key: ${{ secrets.GOOGLE_DRIVE_API_KEY }}
google-drive-api-key: ${{ env.GOOGLE_DRIVE_API_KEY }}
- name: Note skipped secret-backed tests for fork pull requests
if: env.GOOGLE_DRIVE_API_KEY == ''
run: echo "::notice::Tests requiring GOOGLE_DRIVE_API_KEY were skipped because the secret is unavailable to fork pull requests."
20 changes: 18 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Ignore XML files we might use for debugging
cards.xml
cards/*
**/cards/*

# Ignore pyinstaller stuff
__pycache__/*
Expand All @@ -18,6 +18,20 @@ __pycache__/
# C extensions
*.so

# Ignore Nuitka package stuff
**/autofill.dist/*
**/autofill.build/*
**/autofill.onefile-build/*
**/autofill.bin
autofill.command
autofill.exe
autofill-macos-arm.command
autofill-macos-intel.command
autofill-windows.exe
autofill-linux.bin
nuitka-crash-report.xml
autofill_crash_log.txt

# Distribution / packaging
.Python
build/
Expand Down Expand Up @@ -57,6 +71,7 @@ coverage.xml
.pytest_cache/
desktop-tool/export/
desktop-tool/tests/export/
desktop-tool/tests/cards/

cover/

Expand Down Expand Up @@ -94,7 +109,7 @@ ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
.python-version

# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
Expand All @@ -115,6 +130,7 @@ celerybeat.pid

# Environments
.env
.login
.venv
env/
venv/
Expand Down
1 change: 1 addition & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ repos:
rev: v1.7.0
hooks:
- id: mypy
language_version: python3.13
args: [--config-file, mypy.ini, desktop-tool/, MPCAutofill/]
additional_dependencies: [
# typing
Expand Down
Binary file added desktop-tool/assets/placeholder_cover.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading