Releases: FrankFu916/seattrellis
Release list
SeatTrellis v2.0.0
SeatTrellis 2.0.0 — first stable release of the Rust-only line
The Python implementation is retired. v2 runs natively on macOS, Windows and Linux with no Python/Node runtime, and all student data stays local.
Downloads: CLI + backend binaries for three platforms are attached by CI (SHA256SUMS included). Desktop bundles (.app/.dmg, .msi/NSIS, .deb) are attached by the Tauri desktop bundles workflow (DESKTOP-SHA256SUMS). Releases ship unsigned by owner decision — verify checksums; on first launch macOS needs right-click → Open and Windows may show a SmartScreen prompt. CLI users can also cargo install seattrellis_cli once the crates.io publication lands.
SeatTrellis 2.0.0 is the first stable release of the complete Rust rewrite. The Python implementation is retired: v2 runs natively on macOS, Windows and Linux with no Python, Node or other runtime dependencies, and all student data stays on the local machine. Teachers get a React workbench (in the desktop app or any browser), while automation users get a 27-command CLI — both speak to the same Rust core.
Highlights for teachers
- Import a roster (CSV or Excel), set up the classroom, choose rules and goals, generate and compare candidate seating plans, fine-tune by hand, track history and fair rotation across terms, and export or print — entirely offline.
- Hard constraints (fixed seats, must/cannot sit together, minimum distance, groups) are always satisfied in any plan marked Solved, and every plan is re-verified by an independent validator before it reaches you.
- Soft preferences (front seats for poor eyesight, tall students in back, score balance, fair rotation, avoiding recent neighbors, cooling-off) are optimized with explainable per-rule scoring, so every plan can answer "why is this student here?".
- Public exports anonymize names and identifiers automatically; teacher exports keep the detail you need for your own use.
Added
- Native Excel roster import for
.xlsx/.xlsm: first worksheet, supporting shared strings, inline strings, cached formula results, numbers, booleans and loss-free leading zeros. Limits: 20 MiB per file, 10,000 data rows, 256 columns. Formulas without cached values, encrypted workbooks and legacy.xlsfiles are rejected with clear messages. project-export --template <teacher|public>(defaultteacher;publicforces anonymization of names and identifiers) and--orientation <portrait|landscape|auto>(defaultauto: print-html prints A4 landscape, other formats portrait).- Desktop shell (Tauri 2): native open/save dialogs, drag-and-drop roster import, a content security policy on the workbench page, and a session token injected into webview memory only — never into URLs, logs or disk. File bytes move exclusively through dialog-granted paths.
- Loopback API hardening: every
/api/*request path is normalized and requires the Bearer session token; DNS-rebinding, cross-origin and oversized-body protections are enforced for all endpoints.
Fixed
- The desktop app's native open/save dialogs now actually open (the workbench page is served from the loopback backend, which Tauri treats as a remote origin, so the file-bridge commands were silently rejected by the command ACL); byte-moving commands still accept only dialog-granted paths. Drag-and-drop roster import works in the desktop app again.
- Closed an authentication bypass where non-canonical
/api/...spellings (for example an extra leading slash) skipped the Bearer token check. - Same seed plus same input now yields byte-identical results across runs: floating-point soft-cost summation happens in a deterministic order. This restores the reproducibility promise that parity fixtures and regression tests depend on.
- The desktop app's native open/save dialogs now actually open. The workbench page is served from the loopback backend, which Tauri treats as a remote origin, so the file-bridge commands were silently rejected by the command ACL; they are now granted explicitly, and byte-moving commands still accept only dialog-granted paths. Drag-and-drop import works in the desktop app again (Tauri's own drop handler no longer intercepts the HTML5 drag events).
repairnow really reserves locked empty seats: they leave the solve domain entirely and can no longer be occupied by anyone.- Exit codes are unified: a proven-infeasible result exits 3 on
solve,candidates,project-rotateandproject-solvealike, and invalid input (such as a student count mismatch) exits 2 instead of 70. - Negative soft-rule weights are now rejected as the rules reference promises;
weightmust be an integer from 0 to 1,000,000 inclusive, and weight combinations can no longer overflow. - A non-empty string-reference
rules.hardblock in a native solve request (the CLI'sproblem.json) is rejected with guidance toward the top-level index-pair form instead of being silently ignored — previously such constraints were dropped while the plan still claimedhard_constraints_satisfied: true. - Rotation: column group registers aggregate correctly (they used to fragment into one group per student); loading a saved rotation plan repeatedly works (draft ids are unique per load); fairness spread uses the whole-class basis (missing history categories count as 0), so the summary no longer overstates fairness.
- Project references that point outside the project root (for example
outputs_dir: "../x") are rejected instead of creating directories and writing files outside the project. - Migration refuses files whose
schema_versionis newer than supported instead of silently rewriting them to an older version. - Export text honors the Chinese locale consistently across formats: SVG, HTML and print HTML render “空座”, “教室前方” and “N 名学生 · M 个座位 · 可行” like the other export formats.
- XLSX export truncates cell text at Excel's 32,767-character limit instead of producing a corrupt workbook; PNG/PDF exports with no usable system font now carry a warning in the export envelope and print it to stderr instead of silently rendering no text.
- Project archives are extracted with real byte limits (per file and total), so a forged zip can no longer inflate past the configured caps.
- Web workbench: scratch mode can no longer seat one student in two seats; the first launch follows the system language; a 409 revision conflict shows a friendly message and refreshes automatically; a top-level error boundary catches unexpected UI crashes; error toasts no longer surface raw English transport text; production builds ship without sourcemaps.
Changed
- Migration coverage is explicit: only rosters, layouts and projects provide v1→v2 migration steps. Snapshots, candidate sets, rulesets and other kinds fail with a clear error instead of a fake migration.
--in-placerewrites keep a hidden transactional backup whose name embeds a unique transaction id, so repeated runs never overwrite each other. - Plain
exportcovers seven formats (svg,html,png,pdf,xlsx,docx,pptx); the printableprint-htmlstays exclusive toproject-export. - Unknown soft-rule names and unconsumed rule shapes are rejected on the native solve path (previously they were silently ignored), matching the behavior of the workbench validation path.
- The editor protocol documentation and schemas now match the real wire format: the retired
hard_constraintsfield is gone from the editor state, and thevalidationobject attached to command responses is registered in the published JSON Schema. - Desktop releases ship unsigned with
SHA256SUMS/DESKTOP-SHA256SUMSfor integrity verification (owner decision, 2026-08-26). On first launch, macOS requires right-click → Open, and Windows may show a SmartScreen prompt.
Upgrade & compatibility
- From v1.9.x: open your project with
seattrellis_cli schema-migrateor the workbench migration flow — rosters, classroom layouts and project files migrate automatically with a backup taken first. Other v1 artifact kinds are reported as non-migratable rather than half-converted. - From v2 release candidates (rc.1/rc.2): projects and artifacts are compatible; re-export saved plans if you depend on the exact bytes of editor-state documents (the schema was aligned to the wire format).
- The Python package stays frozen at 1.9.0 on the
v1.x-maintenancebranch; it receives no v2 features and is no longer a dependency of anything in v2.
Privacy
- All data is processed locally. There are no accounts, no telemetry and no cloud sync. Real student data must never be committed to public repos; the repository ships fictional examples only.
- Public exports are anonymized at a single central policy layer and are covered by release-time scans for scores, notes, special needs, height, vision and un-anonymized identifiers.
Known limitations
- Right-to-left scripts (Arabic, Hebrew, ...) render in logical order in PNG/PDF exports without bidirectional shaping; HTML/SVG exports are unaffected because the browser does the layout.
- Legacy binary
.xlsfiles are not supported (use.xlsx/.xlsmor CSV). - XLSX import numbers rows after skipping blank rows inside the sheet.
- An unexpected panic exits with code 101, which is outside the frozen exit-code table (0/2/3/4/5/70/130).
- Windows and Linux installers/bundles are built by CI on the release tag; this repository's local release inspection covers macOS arm64.
SeatTrellis v2.0.0-rc.2 — Release Candidate 2
SeatTrellis v2.0.0-rc.2 — Release Candidate 2
SeatTrellis v2 is the Rust-only line of the local-first classroom seating tool: import a roster, generate a seating plan, adjust it manually, and export to print or share. This is the second release candidate of v2.0.0.
What changed since rc.1
- Fixed a generate regression: switching from a saved class back to the scratch workspace could leave a stale room selection and make the next generation fail with "unknown room template". The workbench now resets to a valid catalog room, and room/goal errors show an actionable localized message instead of a generic retry prompt.
- Rule-document validation moved fully to the Rust backend (new
/api/v1/rules/validateendpoint); the React workbench no longer re-derives rule field taxonomy — Rust is the single source of truth. - MSRV CI now tests the whole workspace at Rust 1.88 (not just the core crate).
- Removed leftover Python packaging/Streamlit artifacts from the repository.
What is in this release
- Rust-only runtime: the CLI, the local loopback server and the desktop shell contain no Python runtime; installers are small (5–20 MB target).
- The full classroom workflow in the workbench: roster import with column-mapping preview, class generation with candidate plans, drag-and-drop editing with undo, repair of constrained plans, rotation planning, and export to SVG / HTML / print-HTML / PNG / PDF / XLSX / DOCX / PPTX.
- v1 project migration: project files and artifacts migrate automatically with backups.
- Privacy: local-only processing, no accounts or cloud sync; public exports are anonymized automatically.
- 12 official artifact kinds have strict typed schemas; parity with the frozen v1.9.0 oracle is verified by byte-stable golden replay and cross-language differentials.
Install
Desktop installers are attached to this Release (per platform). The CLI and App-server binaries are also attached.
Code signing status
rc.2 is distributed unsigned. Every release asset is integrity-protected via SHA-256 checksums and SLSA provenance — verify before installing.
- macOS: first launch shows "unidentified developer." Control-click the app → Open → Open, or System Settings → Privacy & Security → Open Anyway. The .dmg SHA-256 is in SHA256SUMS.
- Windows: SmartScreen may show "Windows protected your PC" — More info → Run anyway after verifying the SHA-256 (Get-FileHash). Windows 11 Smart App Control may block the installer; use the portable build.
- Linux: install via the .deb; verify against SHA256SUMS.
If you see anything other than the described warnings, do not bypass it — report it to us instead.
Release assets
- Desktop installers (Windows / macOS / Linux)
seattrellis_cliandseattrellis_appbinaries for Windows / macOS / LinuxSHA256SUMS— asset checksums
SeatTrellis v2.0.0-rc.1 — Release Candidate 1
SeatTrellis v2.0.0-rc.1 — Release Candidate 1
SeatTrellis v2 is the Rust-only line of the local-first classroom seating tool: import a roster, generate a seating plan, adjust it manually, and export to print or share. This is the first release candidate of v2.0.0.
What is in this release
- Rust-only runtime: the CLI, the local loopback server and the desktop shell contain no Python runtime; installers are small (5–20 MB target).
- The full classroom workflow in the workbench: roster import with column-mapping preview, class generation with candidate plans, drag-and-drop editing with undo, repair of constrained plans, rotation planning, and export to SVG / HTML / print-HTML / PNG / PDF / XLSX / DOCX / PPTX.
- v1 project migration: project files and artifacts migrate automatically with backups.
- Privacy: local-only processing, no accounts or cloud sync; public exports are anonymized automatically.
- 12 official artifact kinds have strict typed schemas; parity with the frozen v1.9.0 oracle is verified by byte-stable golden replay and cross-language differentials.
Install
Desktop installers are attached to this Release (per platform). The CLI and App-server binaries are also attached.
Code signing status
rc.1 is distributed unsigned. Every release asset is integrity-protected via SHA-256 checksums and SLSA provenance — verify before installing.
- macOS: first launch shows "unidentified developer." Control-click the app → Open → Open, or System Settings → Privacy & Security → Open Anyway. The .dmg SHA-256 is in SHA256SUMS.
- Windows: SmartScreen may show "Windows protected your PC" — More info → Run anyway after verifying the SHA-256 (Get-FileHash). Windows 11 Smart App Control may block the installer; use the portable build.
- Linux: install via the .deb; verify against SHA256SUMS.
If you see anything other than the described warnings, do not bypass it — report it to us instead.
Release assets
- Desktop installers (Windows / macOS / Linux)
seattrellis_cliandseattrellis_appbinaries for Windows / macOS / LinuxSHA256SUMS— asset checksums
SeatTrellis v1.9.0 — final v1 line release (frozen oracle)
SeatTrellis v1.9.0 — Final v1-line release
This is the final release of the SeatTrellis v1 line (Python). After v1.9.0 the v1 line enters maintenance; all new development continues on the Rust-only v2 line.
What is in this release
- CLI parity completion since v1.8.4:
validate --history-dir,project-validate --strict,project-solve --candidates/--report,project-export --candidateand the full export format set;project-infoprints the project Defaults section. - All 12 official artifact kinds now have strict typed DTOs and generated schemas (v2 side); the golden corpus grew to 38 CLI goldens and 41 parity fixtures, with byte-stable replay fully green.
Install (Python package)
pip install seattrellis==1.9.0
# or download the wheel/sdist from this Release:
pip install seattrellis-1.9.0-py3-none-any.whlVerify assets (macOS/Linux):
shasum -a 256 -c SHA256SUMSDesktop
No new desktop bundle is attached to this Release. If you need the legacy v1 desktop application, download the desktop bundles from the v1.8.4 release — they remain the final v1 desktop builds. The actively maintained desktop experience is the Rust/Tauri preview line (desktop-v* tags).
Migrating to v2
Project files and artifacts can be migrated automatically by the v2 workbench or CLI (schema-migrate / project migration panel), with automatic backups before each migration. v2 is a Rust-only implementation; installers contain no Python runtime.
Release assets
seattrellis-1.9.0-py3-none-any.whl— universal wheelseattrellis-1.9.0.tar.gz— source distributionSHA256SUMS— asset checksums
SeatTrellis Desktop v0.1.2 Preview
Compact Rust/Tauri desktop preview built from the current main branch.
This release contains native Rust/Tauri bundles only: macOS .app/.dmg, Windows .msi/NSIS, and a compact Linux .deb. It does not contain Python, Streamlit, or an internal/ Python runtime. The Linux AppImage is intentionally omitted because bundling GTK/WebKit makes it much larger.
The preview is unsigned and remains separate from Python v1.x. Signing, notarisation, clean-machine installation checks, and full Python feature parity remain before the future Rust v2.0.0 release.
SeatTrellis Desktop v0.1.1 Preview
Rust/Tauri desktop preview built from the current main branch.
Downloads on this page are native Rust/Tauri bundles only; they do not contain Python, Streamlit, or an internal Python runtime. The preview is unsigned and remains separate from Python v1.x. Signing, notarisation, clean-machine installation checks, and full Python feature parity remain before the future Rust v2.0.0 release.
SeatTrellis Desktop v0.1.0 Preview
Initial Rust/Tauri desktop preview.
This preview is separate from the Python v1.x releases and is intended to demonstrate the compact offline desktop path. It is unsigned; signing, notarisation, clean-machine installation checks, and full Python feature parity remain before the future Rust v2.0.0 release.
SeatTrellis v1.8.4
SeatTrellis v1.8.4
User-facing changes
- Reworked roster import review in the React and desktop workbench. The review now uses localized, teacher-facing wording, keeps the confirmation action beside the import changes, and makes the required preview step clear.
- Added native open and save dialogs to the desktop workbench while keeping browser upload and download fallbacks.
- Added advanced settings for importing and downloading rules JSON and irregular-room layout JSON, plus loading multiple historical snapshots for fair rotation and recent-neighbor scoring.
- Added ordinary controls for irregular classrooms, repeatable apart/together/fixed-seat requests, bulk relationship editing, and visual layout editing.
- Added localized error messages across generation, editing, export, and project operations so backend exception text is not shown to teachers.
- Added export templates, field-level privacy controls, name anonymization, A4 orientation, and page scaling to the React and desktop export flow.
- Added project history, privacy checks, backup and restore, rotation comparison, and printable group registers to the workbench.
Engineering and maintenance
- React and desktop clients now share the versioned application API for advanced rules, layout, history, project, and export operations.
- Added browser acceptance coverage for roster import, advanced file settings, rotation generation, project recovery, and bundle restore.
- Refreshed the bundled React workbench so packaged desktop builds include the current import and advanced-settings flow.
- Python and the optional Rust backend remain available side by side; Python remains the default solver.
- CI covers Python 3.11 through 3.14 on Linux, macOS, and Windows, plus Rust, native extensions, security, packaging, and Chromium checks.
Upgrade
python -m pip install --upgrade "seattrellis[all]==1.8.4"SeatTrellis 1.8.4 supports Python 3.11 through 3.14. Existing CLI commands, project files, the React workbench, the Streamlit compatibility shell, and Python/Rust backend selection remain compatible.
Known limitations
- Desktop packages are currently unsigned preview bundles. Signed Windows/macOS installers, notarization, and clean-machine installation checks remain on the desktop roadmap.
- The Rust component remains an optional experimental backend and is not the default solver.
Full details in CHANGELOG.
SeatTrellis v1.8.3
SeatTrellis v1.8.3
User-facing changes
- Improved roster import review: column mapping and import mode changes now clear stale previews, and the confirmation action is shown directly with the review result.
- Added clearer import feedback for incomplete previews, conflicts, and successful changes, with Chinese and English wording kept in sync.
- Added batch project migration with a preflight review, shared-reference checks, and safe rollback when a write fails.
- Added an unsaved-changes warning to the React workbench so local seating edits are less likely to be lost.
- Added a desktop
--versionoption and rebuilt the bundled React workbench with the latest import and editing flow.
Engineering and maintenance
- Added the project migration batch API and browser coverage for the multi-project workflow.
- Kept the optional Rust backend and Python backend available side by side; Python remains the default.
- Updated the roadmap, package metadata, documentation, and release checks for the 1.8.3 line.
- CI now covers Python 3.11 through 3.14 on Linux, macOS, and Windows, plus native-extension, Rust, security, and browser E2E checks.
Upgrade
python -m pip install --upgrade "seattrellis[all]==1.8.3"SeatTrellis 1.8.3 supports Python 3.11 through 3.14. Existing CLI commands, project files, the React workbench, the Streamlit compatibility shell, and Python/Rust backend selection remain compatible.
Known limitations
- Desktop packages are currently preview builds. Signed installers, native file dialogs, and notarization remain on the desktop roadmap.
- The Rust component remains an optional experimental backend and is not the default solver.
Full details in CHANGELOG.
SeatTrellis v1.8.2
SeatTrellis v1.8.2
User-facing changes
- Added multi-period rotation plans, so teachers can prepare several future
seating arrangements and review fairness and repeated-neighbour summaries. - Added local project backup and restore with
.seattrellis.zip, a recent
projects listing, and a privacy scan before sharing a class folder. - Added an optional pywebview desktop preview that opens the same React
workbench as the browser command and cleans up its local service on exit.
Engineering and maintenance
- Added the versioned
rotation_planartifact, JSON Schema export, CLI
commands, and the/api/v1/classes/rotationcontract. - Project bundles reject path traversal and symlink entries, validate their
manifest before restore, and keep the desktop API behind a per-session local
bearer token. - Added Python and browser coverage for rotation plans, project bundles, the
desktop preview, and the release packaging path.
Upgrade
python -m pip install --upgrade "seattrellis[all]==1.8.2"SeatTrellis 1.8.2 supports Python 3.11 through 3.14. Existing CLI commands,
project files, the React workbench, the Streamlit compatibility shell, and
Python/Rust backend selection remain compatible.
Known limitations
- The pywebview desktop command is a preview. Signed Windows/macOS installers,
native file dialogs, and notarization are still planned. - The React workbench still needs its full history browser and project-package
controls; the shared CLI and API operations are already available. - The Rust component remains an optional experimental backend and is not the
default solver.
Full details in CHANGELOG.