Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
124 commits
Select commit Hold shift + click to select a range
b37f2c5
feat: deepen triangle facts and fix OCR sum tokens
DNTOF Nov 1, 2026
5077cfa
feat: Ceva, Menelaus, skew lines, and sphere×plane
DNTOF Nov 1, 2026
4cfd4d7
feat: Stewart, line–plane angle, and two-sphere radical plane
DNTOF Nov 1, 2026
6c2a041
feat: Van Obel, Apollonius circles, line–sphere, tetra/dihedral polish
DNTOF Nov 1, 2026
26a7980
feat: Descartes circles, Euler line/nine-point, cylinder∩plane ellipse
DNTOF Nov 1, 2026
213dfcd
feat: Euler line, altitude Stewart, plane feet, and radical axis
DNTOF Nov 1, 2026
c763b8c
merge: Descartes, Euler OG:GH, and cylinder-plane ellipse
DNTOF Nov 1, 2026
58c5c74
feat: British flag, Varignon, radical axis/center, Viviani, parallelo…
DNTOF Nov 1, 2026
5e4eedc
feat: Ptolemy, Brahmagupta, Napoleon, sphere common chord
DNTOF Nov 1, 2026
13b4e80
feat: Morley, Carnot, |OH|² Euler form, isogonal O↔H
DNTOF Nov 1, 2026
de22a9b
feat: Simson, OH nine-point diameter, τ(I), Cayley–Menger V
DNTOF Nov 1, 2026
cf2767f
feat: write confident over-arrow, sum, and isolated sigma
DNTOF Nov 1, 2026
58201bc
feat: Miquel point, Desargues check, cyl/cone section eccentricity
DNTOF Nov 1, 2026
851bf13
feat: Pascal, Brianchon, tetra faces/heights, point reflection
DNTOF Nov 1, 2026
653db41
feat: Feuerbach distances, Spieker center, and Nagel point
DNTOF Nov 1, 2026
d1af288
feat: Gergonne point, Lemoine/symmedian K, and Brocard angle/points
DNTOF Nov 1, 2026
e2c5c60
feat: de Longchamps, Mittenpunkt, and Schiffler point
DNTOF Nov 1, 2026
2574251
feat: Bevan point, orthic triangle feet, and Euler reflection point
DNTOF Nov 1, 2026
c3e9efe
feat: contact triangle, Spieker circle radius, stable Kosnita; fix Ge…
DNTOF Nov 1, 2026
e582574
feat: extouch triangle, Steiner and Mandart inellipses; Nagel Ceva
DNTOF Nov 1, 2026
ddf9f17
feat: Clawson (acute), Yff center, Exeter point with perspector note
DNTOF Nov 1, 2026
e3459c0
feat: isodynamic/Apollonian X15–16, Steiner X99, Tarry X98 antipode
DNTOF Nov 1, 2026
9f80eb6
feat: Napoleon centers X17–18, Parry X111, Vecten X485–486
DNTOF Nov 1, 2026
22138a8
feat: Hofstadter X359–360, Kenmotu X371, Apollonius X181, Brocard mid…
DNTOF Nov 1, 2026
682fef7
feat: Fermat/isogonic X13–14, Feuerbach point X11, equal-detour/isope…
DNTOF Nov 1, 2026
bcb789e
feat: Moses X75, orthic–tangential X25, orthic circumcenter = N
DNTOF Nov 1, 2026
57ed493
feat: OI similitude centers X55/X56, Euler infinity X30
DNTOF Nov 1, 2026
be36be8
feat: isogonals X57 (Mitten), X58 (Spieker), X84 (Bevan/hexyl)
DNTOF Nov 1, 2026
949cba4
feat: Feuerbach harmonic X12, isogonals X59/X60
DNTOF Nov 1, 2026
43415c3
feat: Grinberg X37, isogonal X81, I–K crosspoint X42
DNTOF Nov 1, 2026
4332b39
feat: intouch orthocenter X65, 3rd Brocard X76, X86 conjugates
DNTOF Nov 1, 2026
d219d36
feat: power points X31/X32, cotangent X69 (isotomic of H)
DNTOF Nov 1, 2026
1598948
feat: circum-inverse X36 of I, power-Ceva X41, double-angle X48
DNTOF Nov 1, 2026
eea2680
feat: de Longchamps X20, Far-out X23, OI companion X35, crosspoint X38
DNTOF Nov 1, 2026
516d6bd
feat: orthic-of-orthic X24, Lemoine-Ceva X43, line-conj X44, Clawson-…
DNTOF Nov 1, 2026
bd84fd2
feat: Mitten-beth X45, H-Ceva-I X46, cos2A X47, triple-angle X49
DNTOF Nov 1, 2026
f1e6fe9
feat: Napoleon isogonals X61/X62, triple-angle X50, de Longchamps-iso…
DNTOF Nov 1, 2026
2abbc3e
feat: orthic G/K X51/X53, tangential O X26, H-Clawson X27, I-H X29
DNTOF Nov 1, 2026
83c0474
feat: port OI-companion isogonals X79/X80 from cloud tip 2c555d4
DNTOF Nov 1, 2026
047d01e
feat: Clawson-X25 cevapoint X28; isogonals X70/X71/X73
DNTOF Nov 1, 2026
d3ba371
feat: orthic-intangents X33/X34, Exeter-isog X66, X28-isog X72; port …
DNTOF Nov 1, 2026
58f0a70
feat: triple-angle isogonals X93/X94 and Prasolov X68
DNTOF Nov 1, 2026
1cff381
chore: sync WASM with X95/X97 orthic isogonals
DNTOF Nov 1, 2026
07d5946
feat: isogonals X67/X74/X77/X78/X82/X83/X85
DNTOF Nov 1, 2026
6064a61
feat: orthic-H X52/X96 and Lemoine/Mitten/OI isogonals X87–X90
DNTOF Nov 1, 2026
4bf5f35
feat: Feuerbach-anticomplement X100/X101 and Λ/Ψ partners X104–X106
DNTOF Nov 1, 2026
2e81d0e
feat: Ψ-partners X107/X108/X109/X112 (K/H, O/H, I/O, H/K)
DNTOF Nov 1, 2026
27c2cec
feat: X102/X103 circum-antipodes and NPC midpoints X116–X119
DNTOF Nov 1, 2026
1388d68
feat: Kiepert/Jerabek NPC centers X113/X114/X115/X125
DNTOF Nov 1, 2026
ba6d49c
feat: X110 Euler-reflection bary + X5/X7/X8 and NPC X120/X121
DNTOF Nov 1, 2026
1ff0187
feat: NPC complements X122/X123/X124/X126/X127 (medial of Ψ/Parry)
DNTOF Nov 1, 2026
c6eae62
feat: orthic NPC centers X128/X129/X130/X137 + mid(H) X132/X133
DNTOF Nov 1, 2026
a998a45
feat: ETC dual X98/X99/X111 + orthic NPC X131/X134–X136/X138/X139
DNTOF Nov 1, 2026
66a77e8
chore: refresh mathcore WASM after orthic NPC ETC centers
DNTOF Nov 1, 2026
5a2986c
feat: ETC X140–X150 complements, anticomplements, L-reflections
DNTOF Nov 1, 2026
df60a45
chore: refresh mathcore WASM after X140–X150 ETC centers
DNTOF Nov 1, 2026
4f948ec
feat: ETC X151–X156 L-reflections and tangential/orthic centers
DNTOF Nov 1, 2026
df56c42
chore: refresh mathcore WASM after X151–X156 ETC centers
DNTOF Nov 1, 2026
a435c57
feat: ETC X157–X159 / X163–X165 tangential and excentral centers
DNTOF Nov 1, 2026
4448f3d
chore: refresh mathcore WASM after X157–X165 ETC centers
DNTOF Nov 1, 2026
80dc68c
feat: ETC X160–X162 gaps and X168/X169/X171–X173 classical centers
DNTOF Nov 1, 2026
079ac07
chore: refresh mathcore WASM after X160–X173 ETC centers
DNTOF Nov 1, 2026
59ff6d0
feat: ETC X166/X167/X170 gaps and X177–X180 mid-arc/Malfatti
DNTOF Nov 2, 2026
f994d3b
chore: refresh mathcore WASM after X166–X170 / X177–X180 ETC centers
DNTOF Nov 2, 2026
beedb9d
feat: ETC X182–X190 Brocard/orthic/circum-inverses/Yff centers
DNTOF Nov 2, 2026
c96208c
chore: refresh mathcore WASM after X182–X190 ETC centers
DNTOF Nov 2, 2026
fff0096
feat: ETC X191–X200 classical Ceva-conjugate centers
DNTOF Nov 2, 2026
183b627
chore: refresh mathcore WASM after X191–X200 ETC centers
DNTOF Nov 2, 2026
1e01b0a
feat: ETC X201–X210 classical Ceva-conjugate centers
DNTOF Nov 2, 2026
cd5f882
chore: refresh mathcore WASM after X201–X210 ETC centers
DNTOF Nov 2, 2026
a62fc61
feat: ETC X211–X220 classical Ceva-conjugate centers
DNTOF Nov 2, 2026
b3d5aef
chore: refresh mathcore WASM after X211–X220 ETC centers
DNTOF Nov 2, 2026
fa04dfe
feat: ETC X221–X230 classical Ceva-conjugate centers
DNTOF Nov 2, 2026
9ac5a66
chore: refresh mathcore WASM after X221–X230 ETC centers
DNTOF Nov 2, 2026
cabde56
feat: ETC X231–X240 Ceva and line-conjugate centers
DNTOF Nov 2, 2026
17aeb07
chore: refresh mathcore WASM after X231–X240 ETC centers
DNTOF Nov 2, 2026
e385fca
feat: ETC X241–X250 line conjugates and isogonals
DNTOF Nov 2, 2026
6ee580a
chore: refresh mathcore WASM after X241–X250 ETC centers
DNTOF Nov 2, 2026
4f951a0
feat: ETC X251–X260 isogonals and cross conjugates
DNTOF Nov 2, 2026
979f7e1
chore: refresh mathcore WASM after X251–X260 ETC centers
DNTOF Nov 2, 2026
91ce382
feat: ETC X261–X270 isogonals and isotomics
DNTOF Nov 2, 2026
305f4f0
chore: refresh mathcore WASM after X261–X270 ETC centers
DNTOF Nov 2, 2026
d6d95b7
feat: ETC X271–X280 isogonals and cevapoint
DNTOF Nov 2, 2026
7b1c4b2
chore: refresh mathcore WASM after X271–X280 ETC centers
DNTOF Nov 2, 2026
2c823a5
feat: ETC X281–X290 isogonals, cross conjugates, cevapoint
DNTOF Nov 2, 2026
f36218e
chore: refresh mathcore WASM after X281–X290 ETC centers
DNTOF Nov 2, 2026
dbb5282
feat: ETC X291–X300 isogonals, Hirst, isotomics
DNTOF Nov 2, 2026
9c995bf
chore: refresh mathcore WASM after X291–X300 ETC centers
DNTOF Nov 2, 2026
eec2c97
feat: ETC X301–X310 isotomics (isodynamic/Napoleon/Clawson band)
DNTOF Nov 2, 2026
390ea77
chore: refresh mathcore WASM after X301–X310 ETC centers
DNTOF Nov 2, 2026
ba96046
feat: ETC X311–X320 isotomics (Kosnita/Droussent band)
DNTOF Nov 2, 2026
bf3bb73
chore: refresh mathcore WASM after X311–X320 ETC centers
DNTOF Nov 2, 2026
1ef31f4
feat: ETC X321–X330 isotomics + X69-Hirst
DNTOF Nov 2, 2026
6ed06e9
chore: refresh mathcore WASM after X321–X330 ETC centers
DNTOF Nov 2, 2026
70df804
feat: ETC X331–X340 isotomics + cevapoints
DNTOF Nov 2, 2026
324bb3e
chore: refresh mathcore WASM after X331–X340 ETC centers
DNTOF Nov 2, 2026
46d99c1
feat: ETC X341–X350 isotomics + Hirst/cevapoints
DNTOF Nov 2, 2026
558706d
chore: refresh mathcore WASM after X341–X350 ETC centers
DNTOF Nov 2, 2026
5e93026
feat: ETC X351–X360 Parry/Weill/Fuhrmann/Morley + Hofstadter duals
DNTOF Nov 2, 2026
e77ac0f
chore: refresh mathcore WASM after X351–X360 ETC centers
DNTOF Nov 2, 2026
90d6f70
feat: ETC X361–X367 Yff isoscelizer + sqrt-side band
DNTOF Nov 2, 2026
417a64a
chore: refresh mathcore WASM after X361–X367 ETC centers
DNTOF Nov 2, 2026
6541487
feat: ETC X371–X380 Kenmotu mates + pedal centroids + Euler intercepts
DNTOF Nov 2, 2026
732abe6
chore: refresh mathcore WASM after X371–X380 ETC centers
DNTOF Nov 2, 2026
57a58ea
feat: ETC X381–X390 orthocentroidal + Conway/Taylor/Hirst band
DNTOF Nov 2, 2026
4a33b43
chore: refresh mathcore WASM after X381–X390 ETC centers
DNTOF Nov 2, 2026
c61b1f0
feat: ETC X391–X400 G–K / Napoleon / Parry / Yff–Malfatti band
DNTOF Nov 2, 2026
882db17
chore: refresh mathcore WASM after X391–X400 ETC centers
DNTOF Nov 2, 2026
74fd720
feat: ETC X401–X410 Bailey / Zeeman–Gossard / Euler-subst band
DNTOF Nov 2, 2026
c94f837
chore: refresh mathcore WASM after X401–X410 ETC centers
DNTOF Nov 2, 2026
17e6952
feat: ETC X411–X420 Euler subst / Hirst / Ceva band
DNTOF Nov 2, 2026
984f154
chore: refresh mathcore WASM after X411–X420 ETC centers
DNTOF Nov 2, 2026
2415173
feat: ETC X421–X430 X4-Hirst / Euler 4th·5th band
DNTOF Nov 2, 2026
1d77829
chore: refresh mathcore WASM after X421–X430 ETC centers
DNTOF Nov 2, 2026
3508b0d
feat: ETC X431–X440 Euler 5th–10th subst / complement X27
DNTOF Nov 2, 2026
44ceb7b
chore: refresh mathcore WASM after X431–X440 ETC centers
DNTOF Nov 2, 2026
391eca5
feat: ETC X441–X450 complements / Euler / Hirst band
DNTOF Nov 2, 2026
e49232b
chore: refresh mathcore WASM after X441–X450 ETC centers
DNTOF Nov 2, 2026
beeb322
feat: ETC X451–X460 Hirst / Alshain / Euler-11th / Antares band
DNTOF Nov 7, 2026
5cf8b17
chore: refresh mathcore WASM after X451–X460 ETC centers
DNTOF Nov 7, 2026
f916196
feat: package MathScrap for Windows, Android, and iOS
DNTOF Nov 7, 2026
e613350
fix: keep only the MathScrap Windows exe and NSIS setup
DNTOF Nov 7, 2026
abb4345
feat: logarithms, zh/en UI, bilingual README, and CI tests
DNTOF Nov 7, 2026
f312906
fix: keep the dev bridge out of packaged builds
DNTOF Nov 7, 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
57 changes: 57 additions & 0 deletions .github/workflows/package-ios.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
name: package-ios

# Manual only. A macOS runner is required and this file does not run on push.
on:
workflow_dispatch:
inputs:
target:
description: simulator builds a .app for the iOS Simulator. device exports an IPA only when signing secrets are set.
type: choice
options:
- simulator
- device
default: simulator

permissions:
contents: read

jobs:
ios:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
toolchain: 1.90.0
targets: aarch64-apple-ios,aarch64-apple-ios-sim,x86_64-apple-ios
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- uses: Swatinem/rust-cache@v2
with:
workspaces: src-tauri
- name: CocoaPods
run: brew install cocoapods
- run: npm ci
- name: Simulator app
if: inputs.target == 'simulator'
run: bash scripts/package-ios.sh --simulator
- name: Signed IPA
if: inputs.target == 'device'
env:
IOS_CERTIFICATE: ${{ secrets.IOS_CERTIFICATE }}
IOS_CERTIFICATE_PASSWORD: ${{ secrets.IOS_CERTIFICATE_PASSWORD }}
IOS_MOBILE_PROVISION: ${{ secrets.IOS_MOBILE_PROVISION }}
APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
APPLE_API_KEY_PATH: ${{ secrets.APPLE_API_KEY_PATH }}
run: bash scripts/package-ios.sh --device
- uses: actions/upload-artifact@v4
if: always() && hashFiles('packaging/out/**') != ''
with:
name: mathscrap-ios
path: |
packaging/out/*
src-tauri/gen/apple/**/*.app
if-no-files-found: warn
194 changes: 194 additions & 0 deletions .github/workflows/package.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
name: package

on:
push:
branches:
- cursor/mathscrap-packaging-*
pull_request:
branches:
- main
workflow_dispatch:
inputs:
sign_windows:
description: Import WINDOWS_CERTIFICATE and sign the EXE
type: boolean
default: false
sign_android:
description: Sign the release APK with ANDROID_KEY_*
type: boolean
default: false

permissions:
contents: read

concurrency:
group: package-${{ github.ref }}
cancel-in-progress: true

jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- uses: dtolnay/rust-toolchain@stable
with:
toolchain: 1.90.0
- uses: Swatinem/rust-cache@v2
with:
workspaces: crates/mathcore
- name: Chrome for sheet end-to-end
run: |
if ! command -v google-chrome >/dev/null 2>&1 && ! command -v google-chrome-stable >/dev/null 2>&1; then
sudo apt-get update
wget -q -O /tmp/chrome.deb https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo apt-get install -y /tmp/chrome.deb
fi
(google-chrome --version || google-chrome-stable --version)
- run: npm ci
- run: npm run lint
- run: npm run test:rust
- run: npm run smoke
- run: npm run smoke:ocr
- run: npm run smoke:ai
- run: npm run test:pack
- name: Start the dev server
run: |
npm run dev > dev-server.log 2>&1 &
echo $! > dev-server.pid
for _ in $(seq 1 40); do
if curl -sf http://127.0.0.1:47321/ >/dev/null; then
exit 0
fi
sleep 2
done
echo "dev server did not start"
cat dev-server.log
exit 1
- name: Sheet end-to-end
env:
SHOTS: e2e-shots
run: npm run e2e:sheet
- name: Per-formula plot end-to-end
env:
SHOTS: e2e-plots
run: npm run e2e
- name: Upload failure logs
if: failure()
uses: actions/upload-artifact@v4
with:
name: mathscrap-test-failure
path: |
e2e-shots
e2e-plots
dev-server.log
if-no-files-found: ignore

web:
needs: test
if: github.event_name != 'pull_request'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm run pack:web
- uses: actions/upload-artifact@v4
with:
name: mathscrap-web-dist
path: dist
if-no-files-found: error

android:
needs: test
if: github.event_name != 'pull_request'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- uses: dtolnay/rust-toolchain@stable
with:
toolchain: 1.90.0
targets: aarch64-linux-android,armv7-linux-androideabi,i686-linux-android,x86_64-linux-android
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- uses: Swatinem/rust-cache@v2
with:
workspaces: src-tauri
- run: npm ci
- name: Debug APK
if: github.event_name != 'workflow_dispatch' || inputs.sign_android == false
run: bash scripts/package-android.sh --debug --install-sdk
- name: Release APK
if: github.event_name == 'workflow_dispatch' && inputs.sign_android
env:
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
ANDROID_KEY_BASE64: ${{ secrets.ANDROID_KEY_BASE64 }}
run: bash scripts/package-android.sh --release --install-sdk
- uses: actions/upload-artifact@v4
with:
name: mathscrap-android
path: |
packaging/out/*.apk
packaging/out/SHA256SUMS
if-no-files-found: error

windows:
needs: test
if: github.event_name != 'pull_request'
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
toolchain: 1.90.0
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- uses: Swatinem/rust-cache@v2
with:
workspaces: src-tauri
- run: npm ci
- name: Import Authenticode certificate
if: github.event_name == 'workflow_dispatch' && inputs.sign_windows
shell: pwsh
env:
WINDOWS_CERTIFICATE: ${{ secrets.WINDOWS_CERTIFICATE }}
WINDOWS_CERTIFICATE_PASSWORD: ${{ secrets.WINDOWS_CERTIFICATE_PASSWORD }}
run: |
if ([string]::IsNullOrEmpty($env:WINDOWS_CERTIFICATE) -or [string]::IsNullOrEmpty($env:WINDOWS_CERTIFICATE_PASSWORD)) {
Write-Error "sign_windows was set but WINDOWS_CERTIFICATE or WINDOWS_CERTIFICATE_PASSWORD is empty."
exit 1
}
New-Item -ItemType Directory -Force -Path certificate | Out-Null
Set-Content -Path certificate/tempCert.txt -Value $env:WINDOWS_CERTIFICATE
certutil -decode certificate/tempCert.txt certificate/certificate.pfx | Out-Null
Remove-Item certificate/tempCert.txt
$secure = ConvertTo-SecureString -String $env:WINDOWS_CERTIFICATE_PASSWORD -Force -AsPlainText
$imported = Import-PfxCertificate -FilePath certificate/certificate.pfx -CertStoreLocation Cert:\CurrentUser\My -Password $secure
"WINDOWS_CERTIFICATE_THUMBPRINT=$($imported.Thumbprint)" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
Remove-Item -Recurse -Force certificate
- name: Unsigned or signed installer
shell: bash
run: bash scripts/package-windows.sh
- uses: actions/upload-artifact@v4
with:
name: mathscrap-windows
path: |
packaging/out/*.exe
packaging/out/*.msi
packaging/out/SHA256SUMS
if-no-files-found: error
12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,15 @@ ASTER_BG_TASK.md
edge-mathscrap.png
screen-check.png

# native shells (generated) and local package output
src-tauri/target
src-tauri/gen
packaging/out

# signing material — never commit
*.keystore
*.jks
*.p12
*.mobileprovision
keystore.properties

Loading
Loading